返回负值的位置大小

 

在我的策略中,我使用一个函数 GetPosSize()来计算头寸大小。我目前只在欧元兑美元上使用该策略,但我不明白为什么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被错误地计算为负数。谢谢。

WHRoeder
  1. 这一行没有任何 作用。
  2. 不要使用NormalizeDouble,永远不要。无论出于什么原因。它是一个笨拙的东西,不要使用它。它的使用总是错误的

我以前读过你关于这个问题的帖子,但我没有理解你的观点,直到你的最后一个链接。谢谢。

 

如果我使用MathRound(),为什么还会得到多个小数位的答案?我试着用DoubleToString,但这完全没有帮助。这完全是由于Print()的限制,还是有其他问题?

posSize = posSize * 10;
MathRound(posSize);
posSize = posSize / 10;
 
NoLimitations: 如果我使用MathRound(),为什么还会得到多个小数位的答案?
MathRound 返回一个双数;无限的小数位。
 
WHRoeder:
NoLimitations 。如果我使用MathRound(),为什么还会得到多个小数位的答案?
MathRound返回一个双数;无限的小数位。

根据它的文档页面,不是这样的。https://docs.mql4.com/math/mathround

"返回值

四舍五入到最接近的整数的值"。

如果它应该这样做但没有,那么需要通知MQ,或者他们需要在函数上贴上警告标签。

 
JD4是对的,文档页说它四舍五入到最近的整数。我不知道还有什么方法可以在不进行四舍五入或截断一定数量的小数位的情况下完成我上面的目的。如果MathRound()或round()不返回整数,那么它们的意义何在?
 
NoLimitations:
JD4是对的,文档页说它四舍五入到最近的整数。我不知道还有什么方法可以在不进行四舍五入或截断一定数量的小数位的情况下完成我上面的目的。如果MathRound()或round()不返回整数,那么它们的意义何在?
你说MathRound给你带来了麻烦,你有没有试过建议的另一种方法,即直接用round()?
 
是的,我已经使用了round();它的结果是完全一样的数值。我试着用MathFloor() 或MathCeil()来计算不那么精确的值,暂时绕过这个问题,但这两个方法似乎也是无能为力。我只是想把一个该死的双数变成一个int,哈哈哈
 

我也刚试过用这个方法,但无济于事。可能DTS只是改变了外观值的准确性而不是实际值?我没有看到任何其他选项。

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