약간의 오류를 발견하는 데 도움이 필요합니다. - 페이지 2

 
누구라도 손을 내밀어주세요.....
 

문제의 일부는 조건이 &&, ||로 가득 찬 경우 큰 길이로 코드를 작성한 방식이며, 함수 호출 후 함수 호출로 인해 디버그하기가 어렵습니다. 이 혼란을 풀 시간이 있는 사람을 찾으면 운이 좋을 것입니다. 문서의 코딩 예제를 보고 코드가 훨씬 더 짧은 줄로 형식 지정되고 주석 처리되어야 하는 방법을 확인해야 합니다.

 

"디버깅하기 어렵게 만든다"?? :( 들어본적은 없지만 이게 진짜야....

컴파일러는 또한 내 코드를 디버그하는 데 어려움을 겪습니다.

그것이 이유라면 이 부분에 대한 모든 코딩 아이디어를 재고해야 한다는 의미인가요? 그러면 완전히 다른 것이 나타날 것입니다 ....... :( :(

 

예, 예를 들어 이 코드에서 후행 정지를 살펴보는 것은 디버그하기 어렵습니다. 각 행이 무엇을 하는지 쉽게 알 수 있으므로 실수를 쉽게 찾아낼 수 있습니다.

   int total= OrdersTotal ();
   
   for ( int cnt= 0 ; cnt<total; cnt++)
   { if (! OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))  
    { if (OrderType()==OP_BUY)
     { if (TrailingStop> 0 )
      { if (Bid-OrderOpenPrice()> Point *TrailingStop)
       { if (OrderStopLoss()<Bid- Point *TrailingStop)
        { if (!OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop,OrderTakeProfit(), 0 ,Green))
         { Print ( "OrderModify error " , GetLastError ());
           return ;
   }}}}}}}
 
나는 && 조건을 제거하고 다음과 같이 if 문으로 넣으려고 했습니다. 하지만 여전히 항상 작동하지 않고 때로는 정지 손실을 한 번만 이동하고 때로는 매수 및 매도 주문 모두에 대해 잘 작동했습니다. .
 
SDC : 예, 예를 들어 이 코드에서 후행 정지를 살펴보는 것은 디버그하기 어렵습니다. 각 행이 무엇을 하는지 쉽게 알 수 있으므로 실수 를 쉽게 찾아낼 수 있습니다.
   int total= OrdersTotal ();
   
   for ( int cnt= 0 ; cnt<total; cnt++)
   { if (! OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))  
    { if (OrderType()==OP_BUY)
     { if (TrailingStop> 0 )
      { if (Bid-OrderOpenPrice()> Point *TrailingStop)
       { if (OrderStopLoss()<Bid- Point *TrailingStop)
        { if (!OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop,OrderTakeProfit(), 0 ,Green))
         { Print ( "OrderModify error " , GetLastError ());
           return ;
   }}}}}}}
  1. 여러 주문이 있는 상태에서 마감/삭제할 때는 반드시 카운트다운 을 해야 합니다. 다른 차트의 EA를 생각해 보십시오. 습관을 들이십시오.
       for ( int cnt= OrdersTotal () - 1 ; cnt >= 0 ; --cnt)
       { if (! OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))  
        { if (OrderType()==OP_BUY)
         { if (TrailingStop> 0 )
          { if (Bid-OrderOpenPrice()> Point *TrailingStop)
           { if (OrderStopLoss()<Bid- Point *TrailingStop)
            { if (!OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop,OrderTakeProfit(), 0 ,Green))
             { Print ( "OrderModify error " , GetLastError ());
               return ;
       }}}}}}}
    또한 x++보다 ++x를 선호합니다(특히 클래스를 다룰 때).
  2. 언어는 for() 문, if() 문이므로 단일 문을 중괄호로 묶는 것은 거의 의미가 없습니다.
    당신은 쓰지 않을 것입니다
    하지만
    { i = 1 + 2 ; }
    { if (i == 3 ) { Print (i); } }
    i = 1 + 2 ;
    if (i == 3 ) Print (i);
    그래서 단순화
       for ( int cnt= OrdersTotal () - 1 ; cnt >= 0 ; --cnt)
       if (! OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))  
       if (OrderType()==OP_BUY)
       if (TrailingStop> 0 )
       if (Bid-OrderOpenPrice()> Point *TrailingStop)
       if (OrderStopLoss()<Bid- Point *TrailingStop)
       if (!OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop,OrderTakeProfit(), 0 ,Green))
       {   Print ( "OrderModify error " , GetLastError ());
           return ;
       }
  3. 이제 "&&"(및 "||") 단락 연산자이므로 s
       for ( int cnt= OrdersTotal () - 1 ; cnt >= 0 ; --cnt)
       if (! OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))  
       && OrderType()==OP_BUY)
       && TrailingStop> 0 )
       && Bid-OrderOpenPrice()> Point *TrailingStop)
       && OrderStopLoss()<Bid- Point *TrailingStop)
       && !OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop,OrderTakeProfit(), 0 ,Green))
       {   Print ( "OrderModify error " , GetLastError ());
           return ;
       }
  4. 주문 선택에 실패 했을 때 주문을 수정하시겠습니까?
       for ( int cnt= OrdersTotal () - 1 ; cnt >= 0 ; --cnt)
       if ( O rderSelect (cnt,SELECT_BY_POS,MODE_TRADES))  
       && OrderType()==OP_BUY)
       && TrailingStop> 0 )
       && Bid-OrderOpenPrice()> Point *TrailingStop)
       && OrderStopLoss()<Bid- Point *TrailingStop)
       && !OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop,OrderTakeProfit(), 0 ,Green))
       {   Print ( "OrderModify error " , GetLastError ());
           return ;
       }
  5. 루프 외부에서 변경되지 않는 모든 테스트를 제거합니다.
     if TrailingStop> 0 ){
       for ( int cnt= OrdersTotal () - 1 ; cnt >= 0 ; --cnt)
       if ( OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))  
       && OrderType()==OP_BUY)
       && Bid-OrderOpenPrice()> Point *TrailingStop)
       && OrderStopLoss()<Bid- Point *TrailingStop)
       && !OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop,OrderTakeProfit(), 0 ,Green))
       {   Print ( "OrderModify error " , GetLastError ());
           return ;
       }
    }
  6. 같은 것을 계속 계산하지 마십시오.
       if (Bid-OrderOpenPrice()> Point *TrailingStop )
       if (OrderStopLoss()<Bid- Point *TrailingStop )
       if (!OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop ,O...
    하고 싶은 일을 파악하고 해야만 하는 시들어
     if TrailingStop> 0 ){
       for ( int cnt= OrdersTotal () - 1 ; cnt >= 0 ; --cnt)
       if ( OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES))  
       && OrderType()==OP_BUY){
           double SL = Bid - Point *TrailingStop;
           if (SL > OrderOpenPrice()     // Start trailing above open price
          && SL > OrderStopLoss()     // And it moves up ONLY
          && !OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(), 0 ,Green))
          {   Print ( "OrderModify error " , GetLastError ());
             return ;
          }
       }
    }
  7. 다른 경우는 어떻습니까? 다른 차트와 EA 는 어떻습니까?
     if TrailingStop> 0 ){
       for ( int cnt= OrdersTotal () - 1 ; cnt >= 0 ; --cnt)
       if ( OrderSelect (cnt,SELECT_BY_POS,MODE_TRADES)
       && OrderMagicNumber() == MyExternal
       && OrderSymbol()      == Symbol ()  
       ){  
           if (OrderType()==OP_BUY)
          {
             double SL = Bid - Point *TrailingStop;
             if (SL > OrderOpenPrice()     // Start trailing above open price
             && SL > OrderStopLoss()     // And it moves up ONLY
             && !OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(), 0 ,Green))
             {   Print ( "OrderModify error " , GetLastError ());
                 return ;
             }
          }   // OP_BUY
           else // OP_SELL (or pending)
          { ...                       
          }                           
       }   // OrderSelect
    }   // Trailing

 
WHRoeder :
  1. 여러 주문이 있는 상태에서 마감/삭제할 때는 반드시 카운트다운 을 해야 합니다. 다른 차트의 EA를 생각해 보십시오. 습관을 들이십시오. 또한 x++보다 ++x를 선호합니다(특히 클래스를 다룰 때).
  2. 언어는 for() 문, if() 문이므로 단일 문을 중괄호로 묶는 것은 거의 의미가 없습니다.
    당신은 쓰지 않을 것입니다
    하지만
    그래서 단순화
  3. 이제 "&&"(및 "||") 단락 연산자이므로 s
  4. 주문 선택에 실패한 경우 주문을 수정하시겠습니까?
  5. 루프 외부에서 변경되지 않는 모든 테스트를 제거합니다.
  6. 같은 것을 계속 계산하지 마십시오. 하고 싶은 일을 파악하고 해야만 하는 시들어
  7. 다른 경우는 어떻습니까? 다른 차트와 EA 는 어떻습니까?

나는 그 코드를 읽기 쉬운 코드의 예로 게시했으며 완성된 독립 실행형 기능의 예를 의미하지 않았습니다.

MT4에 포함된 MetaQuotes MACD 샘플 EA의 후행 중지 코드의 구매 주문 섹션입니다.

1) 사실이 아닙니다. 위 또는 아래로 계산할 수 있으며 루프가 더 효율적이며 OrdersTotal()이 한 번 호출되고 로컬 var에 할당됩니다.

 
SDC : 예시로 해당 코드를 게시했습니다.
나는 단지 주제의 확대를 게시했다.
 

SDC 감사합니다. WHRoeder의 팁도 감사합니다. 유용합니다.

나는 OrderClosePrice()를 이전 코드의 MarketInfo로 바꾸고 편집을 시도했지만( && 조건을 제거 하고 if 문으로 after , 두 번째 for 루프에 넣음) 결과가 여전히 가끔 작동하지 않는 경우가 있습니다. 일하고 있는 .

풀의 총 주문 수를 계산하기 위한 for 루프는 카운트 다운 루프를 사용하지만 x-- 를 사용합니다. 왜 --x 를 제안하는지 이해가 되지 않습니다.

나는 "단락 회로 연산자"를 검색했지만 mql4에서 그것이 무엇을 의미하는지 정말로 이해하지 못합니다. 조금 설명해 주시겠습니까? ^_^ ?? 'if'를 연결하는 것이 왜 나쁜가요?

그건 그렇고, 위의 SDC가 제안한 코드는 내가 사용하는 코드가 아닙니다 >.< .

 

if를 연결하는 것은 나쁘지 않습니다. MQL4 언어 개발자는 위에 게시한 코드를 작성했습니다. 예를 들어 macd 샘플 EA에서 잘라낸 일부 코드입니다.

WHR은 방법에 대한 최근 변경 사항을 언급하고 있었습니다 && || 조건이 평가되어 이제 체인 if 조건만큼 효율적입니다. 이전에는 효율성이 낮았습니다. 두 가지 방법 중 하나를 사용할 수 있습니다. 연결된 ifs는 코드에 분기가 있을 때 유용하므로 'else'를 사용할 수 있습니다.

긴 줄의 if( && || ) 조건은 괄호를 혼동하여 오류를 찾는 것을 더 어렵게 만들 수 있습니다. 그래서 저는 그렇게 하는 것을 좋아하지 않습니다. 또한 너비가 80자를 넘지 않아야 한다는 허용된 코딩 표준이 있습니다. 많은 코더가 그 표준을 준수하는 데 신경을 쓰지 않고 MQL4 개발자는 동일한 긴 이름을 가진 함수에 대한 함수 호출에 사용할 큰 긴 이름의 열거 식별자를 계속 생성하므로 전체 코드 형식 지정에 도움이 되지 않습니다. 많은.