ポジションサイズ 負の値を返す - ページ 3

 
JD4:

上記は、「MathRoundはdoubleを返す;小数点 以下は無限大」という具体的な投稿に対する回答です。"

もう一度、ドキュメントページによると

"戻り値

最も近い整数に丸められた値。"

さて、あなたの投稿のこの部分に対する具体的な回答です。

"ページに書いてあることは、実行する ことです。それは丸めです。小数点以下の桁数の問題とは関係ありません。"

もう一度、引用文を読み直してください。"最も近い整数に丸められた値 " を返すと書いてあります。 整数とは、定義上、小数点以下がない整数です。 もう一度言いますが、もしこれが実際に行うことでないなら、コードか説明が壊れており、一方か他方、あるいは両方をMQが修正する必要があるか、あるいはこれらの機能が宣伝通りに動作しないという警告ラベルが必要でしょう。

実際に与えられた型を返すが、最も近い整数の値と数学的に同等である場合(1.23456から1.00000を返すように、1 == 1.00000)、実際の整数の型を返さない場合は、リファレンスページに「基礎となるデータ型を変更しない」等の明記が必要です。 これは、元のロシアのページから平たく翻訳され、そのため英語では明確になっていないのだと思います。

MetaQuotesのドキュメントはよくても弱いです。

しかし、それはMathRound() が定義によってdoubleを返すと言われています。

もし返された値が次のようなものであったなら。もし、「値を2で割った値」が返されたとしても、それはdoubleです。

同じように、「最も近い整数に丸められた値」もやはりdoubleです。

ご参考までに

 
honest_knave:

MetaQuotesのドキュメントはよくても弱いです。

しかし、そうはいっても、MathRound() は定義上doubleを返します。

もし、返される値がもし、「値を2で割った値」が返されたとしても、それはdoubleです。

同じように、「最も近い整数に丸められた値」もやはりdoubleです。

ご参考になれば幸いです。

私には、"Value rounded till to the nearest integer" は整数の定義からして、整数以外のものを返すとは思えません。 実際にそうなっていることはわかりましたが、コードや公式ページの表現が壊れており、修正する必要があるという私の指摘を強調しました。 int型を返すようにコードを調整するか、ページの表現を変える必要があります。 ユーザーとしてそれをする方法はありません。例えば、yを1.3の値で丸め、それをxに代入する場合、上記の表現では、関数が終了した後、yにはまだ1.3が含まれていると予想されます。私の読みでは、丸めとは丸めようとする最も近い項目に丸めることであって、その項目に相当する値ではありません。 ここでは、「何かが翻訳中に失われる」という表現が非常に適切なのかもしれませんね。
 
JD4:
私には、"Value rounded till the nearest integer" が整数以外のものを返しているとは思えません。 実際にそうなっているのはわかりますが、コードや公式ページの表現が崩れていて、修正する必要があるということが強調されています。 int型を返すようにコードを調整するか、ページの表現を変える必要があります。 ユーザとしては、それをする方法がないのですから。例えば、yを1.3の値で丸め、それをxに代入する場合、上記の表現では、関数が終了した後、yにはまだ1.3が含まれていると予想されます。私の読みでは、丸めとは丸めようとする最も近い項目に丸めることであって、その項目に相当する値ではありません。 ここでは、「何かが翻訳中に失われる」という表現が非常に適切なのかもしれませんね。

この点については、ドキュメントは一貫していると思います。すべてのドキュメントでは、返されるデータ型(int, double, boolなど)がページの一番上に記載され、後の返される値のセクションではこのデータ型が繰り返されることはありません。さらに、このケースでは、入力されたものと全く同じデータ型が返されます。

いずれにせよ、#property strictコンパイラディレクティブを使用している場合は、警告が表示されるはずです。

 
honest_knave:

この点については、ドキュメントは一貫していると思います。すべてのドキュメントでは、返されるデータ型(int, double, boolなど)がページの一番上に記載され、後の返される値のセクションではこのデータ型が繰り返されることはありません。さらに、このケースでは、入力されたものと全く同じデータ型が返されます。

いずれにせよ、#property strictコンパイラー指令を使用している場合は、警告が出るはずです。


私はMQL5.comのフォーラム(https://www.mql5.com/en/forum/61394)でスレッドを立ち上げました。このスレッドが最終的にこのドキュメントの問題を解決してくれることを願っています。多くの人がこのアイデアを支持してくれれば、MQは今まで多くの人にとって問題であったことを解決するために私たちを助けてくれるかもしれません。MQがこのアイデアに乗ることを願います。

knaveとWH - 私はあなたの例に心から同意しますが、私はまだここで問題を見ています、それは私が明確に説明していないか、または私がこれを問題として見ている数少ない人々の一人であるということです。 私にとって、あなたの例は、あなたが自分の側を証明していると思うよりも、このトピックの私の側を証明しているようなものです。

knaveさんの例では、返すべきデータ型であるintを返していないので エラーが返されます。 変数をintとしてキャストしているという事実は、関数が正しく動作していないという問題を容易に理解させるだけです。

この例では、関数に 送られる値としてdoubleを使用しています。 あなたの投稿では、関数から 返されるデータ型がdoubleであることを100%明確に述べているものはありません。

四捨五入は、一般に、特定の数値の値をより低い精度に変更するために認められています。 この点については、全員が同意できると思います。

この場合も同じです。 このページでは、「指定された数値の最も近い整数に丸める」と指定されています。 これは、他の値からより小さい精度(int)に丸めることを意味しています。 使用されている例では、doubleが送られています。 これだけで、100%明らかです。

 

申し訳ありませんが、JD4は私を完全に失いました....

JD4:

あなたの投稿には、関数から 返されるデータ型がdoubleであることを100%断定的に明示しているものはなく、例題がdoubleを送信していることだけを示していますね。

私が矢印でマークアップしたのはまさにそれです。これはdoubleを返し(大きな赤い矢印)、渡されたパラメータもdoubleです(私の矢印の下)。任意の関数を見てみましょう。OrderSend()はintを 返し...OrderClose()はboolを 返し、MathRound()doubleを 返します。

JD4:

knaveさん、この例は、返すべきデータ型であるintを返していないので エラーを返します。 変数をintとしてキャストしているという事実は、関数が正しく動作していないという問題をよりわかりやすくしているだけです。

この関数は宣伝文句通りに動いています。

intだと思えば(間違い)、こうなります。

intとタイプキャストした場合は、間違ったデータ型を使っていることがわかります。

もし、doubleとして扱えば、警告はありません。

 
honest_knave:

JD4さん、すっかり失念してました...。

まさに私が矢印でマークアップした通りです。これはdoubleを返し(大きな赤い矢印)、渡されたパラメータもdoubleです(私の矢印の下)。任意の関数を見てみましょう。OrderSend()はintを 返し...OrderClose()はboolを 返し、MathRound()doubleを 返します。

この関数は、宣伝文句通りに動いているのです。

intだと思えば(間違い)、こうなります。


intとタイプキャストした場合は、間違ったデータ型を使っていることを認識します。


もしこれをdoubleとして扱えば、警告は出ません。

この例ではdoubleを返すようにタイプキャストしています。 int RoundedNumberのコード例では、戻り値の型としてintを返すようにタイプキャストしています。 ページに書かれている内容からすると、intを返すことになっているのでこれは必要ありません。 一番上の行と戻り値の行には、指定した値の整数に丸めることが書かれています。整数は、何度違うことを言っても、小数点以下、分数、その他、整数、ゼロ、負の整数の間の数を表す方法を持ちません。 上に投稿した例のように、与えられたドキュメントに基づいて、MathRound関数「1.3」を送ると、「1.0」ではなく「1」を返すべきです。「1.0」は整数ではなく、「1」は整数なので、です。(となります。)

この関数は int 以外を返すことになっているからではなく、ページで説明されていることに反して動作しているからです。 もし double として扱うなら(これは可能かもしれませんが、想定されていません)、それは間違った関数がドキュメントに書かれていることに反して動作し続けているだけで、送られてきた値から丸められた整数、つまり double を返すことになってしまいます。

double 型を整数に丸め、その戻り値を double 型にキャストまたは格納してもエラーは発生しません。なぜなら、int 型を double 型に格納しても、変換で精度が失われることはないからです。もしdouble型をint型に変換した場合、以前より精度の低い別の形式に変換することになるため、このようなエラーが発生することが予想されます。

MathRound関数がintを返すことになっていないなら、intを返すことになっていないことを示すようにページの文言を変更する必要があります。 私の問題は、その関数が行うことと異なることを行うことではなく、ページが行うことになっていることに反していることなのです。この関数は、ドキュメントページにあるようにintを返すようにコードを修正するか、ドキュメントページを編集して、必ずしもintを返すとは限らないことを反映させる必要があります。

編集:MQLはC++をベースにしており、JavaやC++と構文的に似ているので、C++とJavaの両方のリファレンスを通してさらに調査しました。 C++では、ドキュメントのある部分(http://www.cplusplus.com/reference/cmath/round/)"Round to nearest xに最も近い積分値を返す。半数は0から切り捨てられる。" が、ページの後半で"Return Value x value rounded to the nearest integral (as a floating-point value)." と書かれています。「C++ではfloatを返すと指定されているからです。Javaのドキュメント(http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html)では、roundという名前の2つのメソッドについて次のように書かれています。 どちらも(JavaとC++)それぞれの言語で、MQLのMathRoundやround関数と機能的に等しいものです。

静的long round(double a)
引数に最も近いlongを、同値で切り上げながら返します。
static int round(float a)
引数に最も近いint型(同値は切り上げ)を返します。
 

MQL MathRoundは、floatデータ型の整数値を返します。確かにC++やJavaの丸め関数が 何をするかは関係ありません。もし必要なら、MQLで独自の'int round(double a)'関数を書くのは些細なことです。

(32ビット)浮動小数点は(16ビット)整数を精度を落とすことなく保持することができるのです。問題は、OPが小数点以下2桁に丸められた値を求めていて、それが正確であることを期待していることです。そうではありません。

 
ydrol:

MQL MathRoundは、floatデータ型の整数値を返します。確かにC++やJavaの丸め関数が何をするかは関係ありません。もし必要なら、MQLで独自の'int round(double a)'関数を書くのは些細なことです。

(32ビット)浮動小数点は(16ビット)整数を精度を落とすことなく保持することができるのです。問題は、OPが小数点以下2桁に丸められた値を求めていて、それが正確であることを期待していることです。それはありえません。

私の投稿は、関数がある方法で動作することについての具体的なものであり、私はそのスレッド外のトピックの議論を投稿することを終了しました。 この関数の議論がどこかに移動することになるなら、私はそれでいいです。

Edit: https://www.mql5.com/en/forum/156174 で、この矛盾するドキュメントページについての議論を続けるためのスレッドを立ち上げました ガム、そのスレッドであなたの下の投稿に返答しました。
 

JD4、この件で混乱しているのはあなただけのようです。

HonestKnaveは、ドキュメントにこの関数が doubleを返すことが明確に示されていることを指摘しています。整数はdoubleとして表現されます。

「最も近い整数に丸められた" とは、整数に変換されたことを意味しません。

木片を糸と同じ長さに切るように言っても、木は木のままです。木は木のままで、突然ひもに変わることはありません。

 
JD4:

一番上の行と戻り値の行には、指定された値の整数に丸めることが書かれています。

JD4

この関数は、ドキュメントページにあるように int を返すようにコードを修正するか、ドキュメントページを編集して必ずしも int を返すとは限らないことを反映させる必要があります。 "最も近い整数に丸められた" とはまさにそのことで、整数なのです。


さて、JD4は何をもって納得しているのでしょうか。ドキュメントには、この関数はdoubleを返すとはっきり100%書いてあります。あなたは返される値の説明から別のものを読み取っているのであって、整数を返すとは書いていません。

OrderSend() を見ると、"Returned value:取引サーバーによって注文に割り当てられたチケットの番号を返すか、失敗した場合は -1。追加のエラー情報を得るには、GetLastError()関数を 呼び出す必要があります。" とあります。

では、番号とはどういう意味なのでしょうか?なんだか曖昧だと思いませんか?doubleなのかfloatなのかcharなのかshortなのかintなのかlongなのか。答えはページの一番上にある、さっきの大きな矢印のところにある。これは、返されたデータ型を 確認するための標準的なフォーマットです。(返されたデータ値とは言って いないことに注意)。ドキュメントの中で、「返される値」のセクションがデータ型に 言及している例は、本当にひとつも思いつきません。