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

 
hoz :

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

왜 주문이 전송됩니까? 올바른 매개변수가 없으면 함수는 저주할 것입니다... 그러면 OK... 전송됩니다. 그런 다음 오류가 있음이 밝혀졌습니다. 논리가 무엇입니까?

방금 켰습니다! Victor, "ok"이면 일부 매개변수가 변경되었으며 오류 1이 표시되면 매개변수 중 하나가 변경되도록 요청되었지만 변경되지 않은 것으로 판명되었음을 의미합니다. 그렇기 때문에 그러한 경우를 피하기 위해 논리를 수정해야 하지만 실제 생활에서 이러한 모든 부정확성은 다시 인용과 많은 오류로 바뀔 것입니다!

나는 모든 것이 다른 곳에 흩어져있는 이런 종류의 프로그래밍을 사용하지 않는다는 것을 알고 있습니다. 나는 프로그램을 논리적인 시나리오로 작성하고 모든 이벤트는 순차적으로 진행되며 무언가를 찾기 위해 수색할 필요 없이 모든 조건과 함께 모든 것이 항상 내 눈앞에 있습니다. 그리고 외부 함수 를 사용하여 최종 작업을 수행하고 오류를 확인합니다.

그리고 초심자에게는 당신이 무엇을 가지고 있는지, 어디에 있는지, 모든 것이 숨겨져 있는지 명확하지 않습니다. 추측, 필요 조건을 통과했는지 아닌지?! 어쩐지 지금처럼 말이 많지만 당신의 프로그램은 본질을 전달하지 못합니다. 명확하고 간결해야 합니다!

 

보리스는 물론 모든 것이 한 곳에 있지 않다는 것을 이해합니다. 그러나 수정 기능 직전에 입력된 매개변수가 출력됩니다. 스크린샷을 던졌습니다. 현재새로운 OOP, SL 및 TP가 있습니다. 그리고 그것들은 모두 다릅니다. 모든 것이 근처에 있다면 왜 정글로 올라 갑니까? 인쇄되어 있고 매개변수가 다르다는 것을 알 수 있다면 실제로 다른 것입니다. 아니면 인쇄를 신뢰하지 않습니까?

 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
2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify:  Тикет № 2 ; OrderOpenPrice() = 1.34048 ; OrderStopLoss() = 0.0 ; OrderTakeProfit() = 0.0
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
2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: PositionsManipulations::fOrderModify: _LastError = 0
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
2013.08 . 26 00 : 00   Kevin Martens_Moi_Myrei EURUSD,M15: OrderModify error 1

그리고 그 전에 위에서 보여드린 것처럼 체크가 있습니다.

 if ((ND (OrderOpenPrice()) != fd_OpenPrice) || ND ((OrderStopLoss()) != fd_NewSL) || (ND (OrderTakeProfit()) != fd_NewTP))
{
 ... Ес ли какой-то из параметров отличается от нового, значит выполняется эт о условие.. .
}

얼마나 더 구체적입니까? 그런 다음 위에서 두 명의 광대가 우화를 짓기 시작했습니다. 그들은 내가 묻는 것을 이해할 수 없거나 이해하고 싶지 않은 것 같습니다. 그래서 그들은 이유 없이 웃는다. 그리고 그 질문은 흥미롭습니다.

결국, 예를 들어 다른 유형의 매개변수나 잘못된 번호 또는 다른 옵션을 OrderModify()에 푸시하면 오류가 즉시 발생합니다. 그리고 여기에서 실행되고 OK와 같이 쓰여진 다음 매개 변수가 변경되지 않은 것으로 나타났습니다.

문제는 거기에서 무엇이 잘못되었는지 알아내는 방법입니다. 결국, 나는 내 기능을 게시했습니다. 모든 것이 명확해야 합니다. 여기 그녀가 있습니다:

 // 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())
   {
       if ((ND (OrderOpenPrice()) != fd_OpenPrice) || ND ((OrderStopLoss()) != fd_NewSL) || (ND (OrderTakeProfit()) != fd_NewTP))
      {
       ResetLastError ();
      
       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);
       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 );
      }
      }
   }
   

나는 특히 모든 라인을 주석 처리했습니다. 코드를 엉망으로 만들기 쉽습니다. 의견이 있으시면 도움을 주십시오.

 
hoz :

보리스는 물론 모든 것이 한 곳에 있지 않다는 것을 이해합니다. 그러나 수정 기능 직전에 입력된 매개변수가 출력됩니다. 스크린샷을 던졌습니다. 현재새로운 OOP, SL 및 TP가 있습니다. 그리고 그것들은 모두 다릅니다. 모든 것이 근처에 있다면 왜 정글로 올라 갑니까? 인쇄되어 있고 매개변수가 다르다는 것을 알 수 있다면 실제로 다른 것입니다. 아니면 인쇄를 신뢰하지 않습니까?

그리고 그 전에 위에서 보여드린 것처럼 체크가 있습니다.


모든 것

죄송합니다. 주문 매개변수가 서로 혼동되지 않도록 하는 루프에서 조건을 볼 수 없기 때문에 이것을 이해할 수 없습니다!

오류의 존재는 어딘가에서 논리적 오류를 범하고 있음을 나타냅니다. 그러나 그것은 또한 프로그램이 작동한다고 말하지만 우리는 프로그램의 품질에 관심이 있습니다!

 
borilunad :

죄송합니다. 주문 매개변수가 서로 혼동되지 않도록 하는 루프의 조건을 볼 수 없기 때문에 이것을 이해할 수 없습니다!

오류의 존재는 어딘가에서 논리적 오류를 범하고 있음을 나타냅니다. 그러나 그것은 또한 프로그램이 작동한다고 말하지만 우리는 프로그램의 품질에 관심이 있습니다!


주문이 있는 모든 작업은 주기에서 발생합니다! 이것은 내가 위에서 제공한 코드인 fOrderModify() 메서드가 호출되는 곳입니다.

 //+---------------------------------------------------------------------------------------------------------------------------------------+
//|                                                   Перенос лимитных ордеров по сигналу                                                 |
//+---------------------------------------------------------------------------------------------------------------------------------------+
void MovingLimitPositions ( const double & fd_MurreyLevelsValue[])
{
   double New_OOP = 0.0 ,
          New_SL = 0.0 ,
          New_TP = 0.0 ;
   int     Ticket = - 1 ;
   
   for ( int i= 0 ; i< 13 ; i++)
   {
       Print ( __FUNCTION__ , ": " , "fd_MurreyLevelsValue[" +IToS (i)+ "] = " , DToS (fd_MurreyLevelsValue[i]));
   }

   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
      New_OOP = 0.0 ;
      New_SL = 0.0 ;
      New_TP = 0.0 ;
      
       ResetLastError ();
      
       if (!CPosMan.CheckMyOrdersBased(i, 7 )) continue ;
       if (! OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue ;

      Ticket = OrderTicket();

       Print ( __FUNCTION__ , ": " , "Выбран тикет № " , OrderTicket());
       Print ( __FUNCTION__ , ": " , "Тикет № " , OrderTicket(), "; OrderOpenPrice() = " , OrderOpenPrice(),
             "; OrderStopLoss() = " , OrderStopLoss(), "; OrderTakeProfit() = " , OrderTakeProfit());
          
       if (OrderType() == OP_BUYLIMIT)
      {
         if (ND (OrderOpenPrice()) != ND (fd_MurreyLevelsValue[ 1 ]))
            New_OOP = ND (fd_MurreyLevelsValue[ 1 ]);
         else New_OOP = ND (OrderOpenPrice());
         if (ND (OrderStopLoss()) != ND (fd_MurreyLevelsValue[ 0 ]))
            New_SL = ND (fd_MurreyLevelsValue[ 0 ]);
         else New_SL = ND (OrderStopLoss());
         if (ND (OrderTakeProfit()) != ND (fd_MurreyLevelsValue[ 10 ]))
            New_TP = ND (fd_MurreyLevelsValue[ 10 ]);
         else New_TP = ND (OrderTakeProfit());
         
         Print ( __FUNCTION__ , ": " , "New_OOP = " , New_OOP, "; New_SL = " , New_SL, "; New_TP = " , New_TP);
         
         if (ND (OrderOpenPrice()) != fd_MurreyLevelsValue[ 1 ])
         {
             if (!CPosMan.fOrderModify (OrderTicket(), 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(), " успешно завершена!" );}
         }
      }
      
       if (OrderType() == OP_SELLLIMIT)
      {
         if (ND (OrderOpenPrice()) != ND (fd_MurreyLevelsValue[ 11 ]))
            New_OOP = ND (fd_MurreyLevelsValue[ 11 ]);
         else New_OOP = ND (OrderOpenPrice());
         if (ND (OrderStopLoss()) != ND (fd_MurreyLevelsValue[ 12 ]))
            New_SL = ND (fd_MurreyLevelsValue[ 12 ]);
         else New_SL = ND (OrderStopLoss());
         if (ND (OrderTakeProfit()) != ND (fd_MurreyLevelsValue[ 2 ]))
            New_TP = ND (fd_MurreyLevelsValue[ 2 ]);
         else New_TP = ND (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 (!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());
            }
         }
      }
   }
   Print ( __FUNCTION__ , ": " , "OUT OF FUNCTION" );
}

모든 것이 거기에 표시됩니다... 루프가 반복될 때마다 오류가 재설정 된다는 것도 분명합니다. 이렇게 하면 이전 주문의 오류가 있는 경우 다음 주문으로 건너뛰지 않습니다(물론 그 값을 의미합니다).

어디가 더 쉬울까요? 여기 모든 것이 너무 간단합니다..

 

메시지를 찾았습니다

동일한 터미널 버그가 있습니다. 나는 이런 적이 없었다. 왜냐하면 나는 전에 한 번에 보류 주문의 3 가지 매개 변수 (OOP, SL 및 TP)를 변경하려고 시도하지 않았습니다. 그래서 ... 그리고 나는 버그를 발견했습니다.

제가 알기로는 예를 들어 시가와 손절매가 바뀌지 않고 그 대신에 같은 값을 받았는데 테이크가 바뀌었다면요. 이 또한 오류가 발생합니까? 그런 다음 문서가 비뚤어진 것으로 판명되었습니다. 그리고이 순간은 지원되지 않습니다 또는 무엇입니까?

 
hoz :

메시지를 찾았습니다

동일한 터미널 버그가 있습니다. 나는 이런 적이 없었다. 왜냐하면 나는 전에 한 번에 보류 주문의 3 가지 매개 변수 (OOP, SL 및 TP)를 변경하려고 시도하지 않았습니다. 그래서 ... 그리고 나는 버그를 발견했습니다.

제가 알기로는 예를 들어 시가와 손절매가 바뀌지 않고 그 대신에 같은 값을 받았는데 테이크가 바뀌었다면요. 이 또한 오류가 발생합니까? 그런 다음 문서가 비뚤어진 것으로 판명되었습니다. 그리고 이 순간이 지원되지 않거나 무엇입니까?

틱마다 거리도 확인하시나요?! 나는 오랫동안 TF 바가 열릴 때 주문을 열고 M1에서 바가 열릴 때만 수정하고 닫는 것을 규칙으로 만들었습니다! 위의 코드는 완료된 작업에 대한 보고서를 생각나게 합니다. 모든 것이 있는 것처럼 보이지만 구체적인 것은 없습니다! 특정 조건에 따라 모든 동작을 정의하는 사이클이 보이지 않습니다! 수정해야 할 사항을 알려주지 않는 주기만 표시되고 수정하지 않으면 오류가 발생하지 않습니다.

여러분의 오류는 전역 수준에서 수행해야 하는 작업과 로컬 수준에서 수행해야 하는 작업에 대한 혼동에서 비롯될 수 있으며 오류는 항상 마지막 오류이고 이전 오류는 함수가 종료될 때 사용자의 참여 없이 재설정된다는 Renat의 중요한 말에 주의하십시오. !

 
borilunad :

틱마다 거리도 확인하시나요?!

아니다! 조건이 충족되는 경우에만 수정할 수 있는 권한이 있습니다. 이 경우 수정 조건은 계산된 수준의 변경입니다. 이와 같이:

 void OnTick ()
{
   static double FirstInd = 0.0 ;                    // Переменная, которая хранит значение 1-ого индекса массива
   double MurreyLevelsValue[ 13 ];                    // Массив значений уровней
   GetDataFromIndicator (MurreyLevelsValue);        // Функция, которая получает значения из индикатора уровней
   
   if (gdt_LastBarTime <= Time[ 0 ])
   {
      OTotal = CPosInf.FindPositions (AmountPosByType);   // Получаем количество позиций( по типам ).
      
      GetTradeSignal (MurreyLevelsValue);
      
      gdt_LastBarTime = Time[ 0 ];
   }

   if (FirstInd != ND (MurreyLevelsValue[ 1 ]))      // Если значений текущего состояния переменной FirstInd не равно новому рассчитанном, то.. 

   {
      MovingLimitPositions (MurreyLevelsValue);     // ..модифицируем ордер новым значением
      FirstInd = ND (MurreyLevelsValue[ 1 ]);
   }
}

단지? 단지....

보릴루나드 :


나는 오랫동안 TF 바가 열릴 때 주문을 열고 M1에서 바가 열릴 때만 수정하고 닫는 것을 규칙으로 만들었습니다! 위의 코드는 완료된 작업에 대한 보고서를 생각나게 합니다. 모든 것이 있는 것처럼 보이지만 구체적인 것은 없습니다! 특정 조건에 따라 모든 동작을 정의하는 사이클이 보이지 않습니다! 수정해야 할 사항을 알려주지 않는 주기만 표시되고 수정하지 않으면 오류가 발생하지 않습니다.

저도 M1 개봉때만 수정하자는 생각을 하고 있었는데, 미리 정해진 값만큼 수정을 하면 적용됩니다. 하지만 M1에서 이 데이터를 확인할 필요가 없는 상황이 있습니다. 예를 들어, 내 정지는 이미 계산된 수준에서 후행하고 있습니다. 그런 다음 위에서 보여드린 것처럼 OnInit() 함수를 확인합니다.

 if (FirstInd != ND (MurreyLevelsValue[ 1 ]))
{
   MovingLimitPositions (MurreyLevelsValue);
   FirstInd = ND (MurreyLevelsValue[ 1 ]);
}
저것들. 레벨이 변경된 경우 ... 수정합니다. 이렇게 하면 불필요한 수정 시도를 없앨 수 있습니다. 말하자면 타이머가 아닌 신호에 의한 수정입니다. 여기 명확합니까?


보릴루나드 :


특정 조건에 따라 모든 동작을 정의하는 사이클이 보이지 않습니다! 수정해야 할 사항을 알려주지 않는 주기만 표시되고 수정하지 않으면 오류가 발생하지 않습니다.

나는 거기에 모든 것을 인쇄했습니다. 무엇을 이해할 수 없습니까... :(

보릴루나드 :

여러분의 오류는 전역 수준에서 수행해야 하는 작업과 로컬 수준에서 수행해야 하는 작업에 대한 혼동에서 비롯될 수 있으며 오류는 항상 마지막 오류이고 이전 오류는 함수가 종료될 때 사용자의 참여 없이 재설정된다는 Renat의 중요한 말에 주의하십시오. !

알고 보니 이 문제는 나에게만 일어나는 것이 아니다. 다음 은 예입니다 ...

그리고 그 과정에서 결정되지 않았고 해결하지도 않을 것입니다. 개발자가 게으른 것은 아닐까? 내가 오류, 누군가 스레드로 올바르게 작동하지 않으면 동일한 Renat가 코드를 찔러보고 무엇이 잘못되었는지 말할 수 없습니다.

결국 수정 기능 이전에 수정 예정인 파라미터의 새로운 값과 현재 값이 출력된다면 이 값들이 존재한다는 것이 분명해진다. 왜 더 높은 곳으로 올라가는가? 값이 있고 오류가 없다는 것이 분명합니다(오류를 위해 거기에 인쇄했습니다). 따라서 모든 것이 논리적으로 정확합니다. 캔트는 수정 기능에서 의미합니다.

 
hoz :

아니다! 조건이 충족되는 경우에만 수정할 수 있는 권한이 있습니다. 이 경우 수정 조건은 계산된 수준의 변경입니다. 이와 같이:

단지? 단지....

저도 M1 개봉때만 수정하자는 생각을 하고 있었는데, 미리 정해진 값만큼 수정을 하면 적용됩니다. 하지만 M1에서 이 데이터를 확인할 필요가 없는 상황이 있습니다. 예를 들어, 내 정지는 이미 계산된 수준에서 후행하고 있습니다. 그런 다음 위에서 보여드린 것처럼 OnInit() 함수를 확인합니다.

저것들. 레벨이 변경된 경우 ... 수정합니다. 이렇게 하면 불필요한 수정 시도를 제거할 수 있습니다. 말하자면 타이머가 아닌 신호에 의한 수정입니다. 여기 명확합니까?


나는 거기에 모든 것을 인쇄했습니다. 무엇을 이해하지 못하겠습니까... :(

알고보니 이 문제는 나에게만 일어나는 것이 아니다. 다음 은 예입니다 ...

그리고 그 과정에서 결정되지 않았고 해결하지도 않을 것입니다. 개발자가 게으른 것은 아닐까? 내가 오류, 누군가 스레드로 올바르게 작동하지 않으면 동일한 Renat가 코드를 찔러보고 무엇이 잘못되었는지 말할 수 없습니다.

결국 수정 기능 이전에 수정 예정인 파라미터의 새로운 값과 현재 값이 출력된다면 이 값들이 존재한다는 것이 분명해진다. 왜 더 높은 곳으로 올라가는가? 값이 있고 오류가 없다는 것이 분명합니다(오류를 위해 거기에 인쇄했습니다). 따라서 모든 것이 논리적으로 정확합니다. 캔트는 수정 기능에서 의미합니다.

나는 이미 이 예를 보았다. 그러나 우리는 더 나은 것이 없을 때까지 어떤 조건에도 적용해야 합니다. 귀하의 코드는 저를 확신하지 못합니다. 이제 점심을 먹겠습니다. 그런 다음 SL을 설정하고, 이를 used로 전송하고, 수정 기능에 대한 단 한 번의 호출에 대해 트롤링하는 데 명확하게 작동하는 사이클의 예를 드리겠습니다. 여기서 갑자기 발생하면 오류가 처리됩니다. 작동 중에는 테스터에서 발생하지 않습니다.

Modify() 함수를 원하십니까?

 
hoz :

결국 수정 기능 이전에 수정 예정인 파라미터의 새로운 값과 현재 값이 출력된다면 이 값들이 존재한다는 것이 분명해진다. 왜 더 높은 곳으로 올라가는가? 값이 있고 오류가 없다는 것이 분명합니다(오류를 위해 거기에 인쇄했습니다). 따라서 모든 것이 논리적으로 정확합니다. 캔트는 수정 기능에서 의미합니다.

코드는 꽤 .. 하지만 실생활(데모 아님)에서 작동합니까?
 

빅터, 왜 정리해고에서 SL과 TP를 수정하기 시작 했습니까?! 일반적으로 포지션을 연 후에 SL을 넣고 SL을 중고로 옮긴 후 TP를 넣는 것이 합리적입니다! 그렇다면 왜 서버를 헛되이 괴롭히고이 고통이 필요합니까?!

빠르고 명료하게 동작하도록 코드를 최소한으로 줄여야 하고, 그러면 시장의 요동으로 인해 수정이 더 쉬울 것입니다! 시장의 현실과 관련된 모든 뉘앙스에 대해 신중하게 생각하십시오!