문제의 일부는 조건이 &&, ||로 가득 찬 경우 큰 길이로 코드를 작성한 방식이며, 함수 호출 후 함수 호출로 인해 디버그하기가 어렵습니다. 이 혼란을 풀 시간이 있는 사람을 찾으면 운이 좋을 것입니다. 문서의 코딩 예제를 보고 코드가 훨씬 더 짧은 줄로 형식 지정되고 주석 처리되어야 하는 방법을 확인해야 합니다.
예, 예를 들어 이 코드에서 후행 정지를 살펴보는 것은 디버그하기 어렵습니다. 각 행이 무엇을 하는지 쉽게 알 수 있으므로 실수를 쉽게 찾아낼 수 있습니다.
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 ;
}}}}}}}
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 ;
}}}}}}}
여러 주문이 있는 상태에서 마감/삭제할 때는 반드시 카운트다운 을 해야 합니다. 다른 차트의 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를 선호합니다(특히 클래스를 다룰 때).
언어는 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 ;
}
이제 "&&"(및 "||") 가 단락 연산자이므로 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 ;
}
주문 선택에 실패 했을 때 주문을 수정하시겠습니까?
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 ;
}
루프 외부에서 변경되지 않는 모든 테스트를 제거합니다.
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 ;
}
}
같은 것을 계속 계산하지 마십시오.
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 ;
}
}
}
다른 경우는 어떻습니까?다른 차트와 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_BUYelse// OP_SELL (or pending)
{ ...
} } // OrderSelect
} // Trailing
if를 연결하는 것은 나쁘지 않습니다. MQL4 언어 개발자는 위에 게시한 코드를 작성했습니다. 예를 들어 macd 샘플 EA에서 잘라낸 일부 코드입니다.
WHR은 방법에 대한 최근 변경 사항을 언급하고 있었습니다 && || 조건이 평가되어 이제 체인 if 조건만큼 효율적입니다. 이전에는 효율성이 낮았습니다. 두 가지 방법 중 하나를 사용할 수 있습니다. 연결된 ifs는 코드에 분기가 있을 때 유용하므로 'else'를 사용할 수 있습니다.
긴 줄의 if( && || ) 조건은 괄호를 혼동하여 오류를 찾는 것을 더 어렵게 만들 수 있습니다. 그래서 저는 그렇게 하는 것을 좋아하지 않습니다. 또한 너비가 80자를 넘지 않아야 한다는 허용된 코딩 표준이 있습니다. 많은 코더가 그 표준을 준수하는 데 신경을 쓰지 않고 MQL4 개발자는 동일한 긴 이름을 가진 함수에 대한 함수 호출에 사용할 큰 긴 이름의 열거 식별자를 계속 생성하므로 전체 코드 형식 지정에 도움이 되지 않습니다. 많은.
문제의 일부는 조건이 &&, ||로 가득 찬 경우 큰 길이로 코드를 작성한 방식이며, 함수 호출 후 함수 호출로 인해 디버그하기가 어렵습니다. 이 혼란을 풀 시간이 있는 사람을 찾으면 운이 좋을 것입니다. 문서의 코딩 예제를 보고 코드가 훨씬 더 짧은 줄로 형식 지정되고 주석 처리되어야 하는 방법을 확인해야 합니다.
"디버깅하기 어렵게 만든다"?? :( 들어본적은 없지만 이게 진짜야....
컴파일러는 또한 내 코드를 디버그하는 데 어려움을 겪습니다.
그것이 이유라면 이 부분에 대한 모든 코딩 아이디어를 재고해야 한다는 의미인가요? 그러면 완전히 다른 것이 나타날 것입니다 ....... :( :(
예, 예를 들어 이 코드에서 후행 정지를 살펴보는 것은 디버그하기 어렵습니다. 각 행이 무엇을 하는지 쉽게 알 수 있으므로 실수를 쉽게 찾아낼 수 있습니다.
나는 그 코드를 읽기 쉬운 코드의 예로 게시했으며 완성된 독립 실행형 기능의 예를 의미하지 않았습니다.
MT4에 포함된 MetaQuotes MACD 샘플 EA의 후행 중지 코드의 구매 주문 섹션입니다.
1) 사실이 아닙니다. 위 또는 아래로 계산할 수 있으며 루프가 더 효율적이며 OrdersTotal()이 한 번 호출되고 로컬 var에 할당됩니다.
SDC 감사합니다. WHRoeder의 팁도 감사합니다. 유용합니다.
나는 OrderClosePrice()를 이전 코드의 MarketInfo로 바꾸고 편집을 시도했지만( && 조건을 제거 하고 if 문으로 after , 두 번째 for 루프에 넣음) 결과가 여전히 가끔 작동하지 않는 경우가 있습니다. 일하고 있는 .
풀의 총 주문 수를 계산하기 위한 for 루프는 카운트 다운 루프를 사용하지만 x-- 를 사용합니다. 왜 --x 를 제안하는지 이해가 되지 않습니다.
나는 "단락 회로 연산자"를 검색했지만 mql4에서 그것이 무엇을 의미하는지 정말로 이해하지 못합니다. 조금 설명해 주시겠습니까? ^_^ ?? 'if'를 연결하는 것이 왜 나쁜가요?
그건 그렇고, 위의 SDC가 제안한 코드는 내가 사용하는 코드가 아닙니다 >.< .
if를 연결하는 것은 나쁘지 않습니다. MQL4 언어 개발자는 위에 게시한 코드를 작성했습니다. 예를 들어 macd 샘플 EA에서 잘라낸 일부 코드입니다.
WHR은 방법에 대한 최근 변경 사항을 언급하고 있었습니다 && || 조건이 평가되어 이제 체인 if 조건만큼 효율적입니다. 이전에는 효율성이 낮았습니다. 두 가지 방법 중 하나를 사용할 수 있습니다. 연결된 ifs는 코드에 분기가 있을 때 유용하므로 'else'를 사용할 수 있습니다.
긴 줄의 if( && || ) 조건은 괄호를 혼동하여 오류를 찾는 것을 더 어렵게 만들 수 있습니다. 그래서 저는 그렇게 하는 것을 좋아하지 않습니다. 또한 너비가 80자를 넘지 않아야 한다는 허용된 코딩 표준이 있습니다. 많은 코더가 그 표준을 준수하는 데 신경을 쓰지 않고 MQL4 개발자는 동일한 긴 이름을 가진 함수에 대한 함수 호출에 사용할 큰 긴 이름의 열거 식별자를 계속 생성하므로 전체 코드 형식 지정에 도움이 되지 않습니다. 많은.