ポジションサイズ 負の値を返す

 

私のストラテジーでは、ポジションサイズを計算するためにGetPosSize()という関数を 使用しています。今のところEURUSDでしか使っていないのですが、なぜposSizeが負の値を返してOrderSend error 4051になるのかがどうしても分かりません。何か手助けがあれば、とてもありがたいです。ここに関連するすべてのコードを掲載します。コード全体を通してposSizeに対する他の計算は行われず、関数が呼び出されるだけです。3つの別々のコードはすべて関数の中にあります。

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は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()を使って、より正確に値を計算し、とりあえず問題を回避しようとしましたが、これらも同様に何もしていないようです。ただ、doubleをintにしたいだけなんですけどね、ハハハ。
 

私も先ほどこれを使ってみましたが、効果はありませんでした。DTSは単に見た目の値の精度を変えるだけで、実際の値ではない可能性があります。他のオプションは見当たりません。

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