음수 값을 반환하는 위치 크기

 

내 전략 내에서 GetPosSize() 함수 를 사용하여 위치 크기를 계산합니다. 나는 현재 EURUSD와 함께 전략을 사용하고 있으며 평생 동안 posSize가 음수 값을 반환하여 OrderSend 오류 4051이 발생하는 이유를 이해할 수 없습니다. 도움을 주시면 감사하겠습니다. 여기에 모든 관련 코드를 게시하겠습니다. posSize에 대한 다른 계산은 코드 전체에서 수행되지 않고 함수만 호출됩니다. 세 개의 개별 코드는 모두 함수 내에 있습니다.

 double GetPosSize( string symbol, double pipsToSL)
{
   double marginReq;
   double marginAllot = AccountBalance()/Number_of_Pairs;
   double posSize;
   int pairsOpen = OpenOrderCount();
   int pairsNotOpen = Number_of_Pairs - pairsOpen;
   if (symbol == "EURUSD" )
   {
      marginReq = 2600 ;
   }
 if (pairsOpen == 0 )
   {
      posSize = (marginAllot * (PercentRisk/ 100 )/pipsToSL) / 10 ;
   }
 NormalizeDouble (posSize, 2 );
   Print (posSize);
   return (posSize);
 

marginAllot, PercentRisk 및 pipsToSL 값을 인쇄하여 음수가 나오는 위치를 좁히십시오. 내 추측으로는 pipsToSL이 특정 상황에서 음수로 전달되고 있다는 것입니다.

 
  1. NormalizeDouble (posSize, 2 );
    이 줄은 아무 것도 하지 않습니다.
  2. 절대로 NormalizeDouble 을 사용하지 마십시오. 어떤 이유로. 엉터리입니다, 사용하지 마세요. 용도는 항상 틀리다
 
honest_knave :

marginAllot, PercentRisk 및 pipsToSL 값을 인쇄하여 음수가 나오는 위치를 좁히십시오. 내 추측으로는 pipsToSL이 특정 상황에서 음수로 전달되고 있다는 것입니다.

실제로 나머지 코드에서 pipsToSL이 음수로 잘못 계산된 일부 위치를 찾을 수 있었습니다. 감사해요.

WHR로더 :
  1. 이 줄은 아무 것도 하지 않습니다.
  2. 절대로 NormalizeDouble 을 사용하지 마십시오. 어떤 이유로. 엉터리입니다, 사용하지 마세요. 용도는 항상 틀리다

이전에 이에 대해 게시한 것을 읽었지만 마지막 링크까지 요점을 이해하지 못했습니다. 감사해요.

 

MathRound()를 사용하는 경우에도 소수점 이하 자릿수에 대한 답을 얻는 이유는 무엇입니까? DoubleToString을 사용해 보았지만 전혀 도움이 되지 않았습니다. 전적으로 Print()의 한계 때문입니까 아니면 다른 문제가 있습니까?

posSize = posSize * 10 ;
MathRound (posSize);
posSize = posSize / 10 ;
 
NoLimitations : MathRound()를 사용하는 경우에도 소수점 이하 자릿수에 대한 답을 얻는 이유는 무엇입니까?
MathRound는 double을 반환합니다. 소수점 이하 자릿수 무한.
 
WHRoeder :
NoLimitations : MathRound()를 사용하는 경우에도 소수점 이하 자릿수에 대한 답을 얻는 이유는 무엇입니까?
MathRound는 double을 반환합니다. 소수점 이하 자릿수 무한.

그것에 대한 문서 페이지에 따르면 아닙니다. https://docs.mql4.com/math/mathround

" 반환 값

가장 가까운 정수로 반올림된 값입니다."

그래야 하지만 그렇지 않은 경우 MQ에 알림을 보내거나 함수에 경고 레이블을 지정해야 합니다.

 
JD4가 맞습니다. 문서 페이지에는 가장 가까운 정수로 반올림한다고 나와 있습니다. 특정 소수점 이하 자릿수를 반올림하거나 자르지 않고 위에서 시도한 것을 달성하는 다른 방법이 확실하지 않습니다. 정수를 반환하지 않는 경우 MathRound() 또는 round()의 요점은 무엇입니까?
 
NoLimitations :
JD4가 맞습니다. 문서 페이지에는 가장 가까운 정수로 반올림한다고 나와 있습니다. 특정 소수점 이하 자릿수를 반올림하거나 자르지 않고 위에서 시도한 것을 달성하는 다른 방법이 확실하지 않습니다. 정수를 반환하지 않는 경우 MathRound() 또는 round()의 요점은 무엇입니까?
당신은 MathRound가 당신에게 적합하다고 말했습니다. 그냥 round()의 제안된 대안을 시도 했습니까?
 
예, 저는 round()를 사용했습니다. 결과적으로 똑같은 값이 나왔습니다. MathFloor() 또는 MathCeil()을 사용하여 값을 덜 정확하게 계산하고 당분간 문제를 해결하려고 시도했지만 둘 다 겉보기에는 아무 것도 하지 않는 것 같습니다. 젠장 더블을 인트로 바꾸고싶다 ㅋㅋㅋㅋ
 

나는 또한 이것을 사용하려고 시도했지만 아무 소용이 없었습니다. 아마도 DTS는 실제 값이 아닌 모양에 대한 값의 정확도를 단순히 변경합니까? 다른 옵션이 보이지 않습니다.

posSize = posSize * 100 ;
DoubleToString (posSize,0);
StringToDouble (posSize);
posSize = posSize / 100 ;
사유: