エラー、バグ、質問 - ページ 2939

 
x572intraday:
価格はすべて小数点以下5桁まで表示され、同じリストの中の1つはなぜかこのように受け取られる:なぜ?エラーなのか、それとも私の出力が同じに見えるように調整すべきなのか。まあ、仮にPrintFormatやfprintで梳くとして、原理的に数値の表現として間違ってはいないのでしょうか。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

ニコライ・セムコ さん 2020.01.05 21:41

私はいつもこの疑問を抱いています。
常にすべての IEEE 規格 754についての 話が、人々はしばしば、彼らはウィキペディアに行くとき - 複雑さのために、または怠惰のためかどうか規格の意味を理解せずに残します。

この投稿をさらに参考にしていただくために、少し時間をかけて、この規格をできるだけ簡潔に、わかりやすい言葉で説明することを心がけたいと思います。


つまり、double は8バイト=64ビットで構成されています。(float 4バイト=32ビット)

また double および float 数値表現は 符号、指数、仮数の 3つの要素から構成されて います。


DOUBLE(ダブル)。


フロートです。

当然ながら、このフォーマットでは10進数表現はなく、2進数表現のみとなる。

  • 符号は1ビットです。0なら+(プラス)、1なら-(マイナス)です。
  • 指数は、数 2 の次数を格納する。floatの場合は-12610~12710,doubleの場合は-102210~102310の範囲で指定可能です。
  • 仮数は、2進数の数値そのものの分数部分を、その最初の単位に関係なく、最初の単位の後にコンマが立つ形に縮小したもので、コンマ


数字の2進数表現と10進数との関係を少し理解していること。

24= 100002 = 1610

23= 10002 = 810

22= 1002 = 4

21=102= 2

20=12=110

2-1= 0.12=(1/2)10= 0.510

2-2= 0.012 = (1/4)10= 0.2510

2-3= 0.0012 = (1/8)10= 0.12510

2-4= 0.00012 = (1/16)10= 0.062510

2-5= 0.000012 = (1/32)10= 0.0312510

2-6= 0.0000012 = (1/64)10= 0.01562510

2-7= 0.00000012 = (1/128)10= 0.007812510

2-8= 0.000000012 = (1/256)10= 0.0039062510

2-9= 0.0000000012 = (1/512)10= 0.00195312510

2- 10= 0.00000000012 = (1/1024)10= 0.000976562510

2- 11= 0.000000000012 = (1/2048)10= 0.0004882812510

2- 12= 0.0000000000012 = (1/4096)10= 0.00024414062510

2- 13= 0.00000000000012 = (1/8192)10= 0.000122070312510

ダブルの例をおさらいして おきましょう

例1

891677.4025191という10進数の数字があります。

この数字は2進数で表すことができる。

11011001101100011101.01100111000010110111110110001000001111111010001110
(確認したい人はどうぞ)))

与えられた数値の仮数を取り出すには、コンマを19桁左に移動させ(この場合)、最初の単位の後に来るようにすればよいのです。

1.1011001101100011101011001110000101101111101111000101000001111101110001110* 219

でも、仮数は52ビットしかないんです。そこで、最初の52個の有効ビットを取ります

Мантисса =1011001101100011101011001110000101101111101111000101

指数=(19+1023)10100000100102(指数は符号付き数字で、指数が負になることもあるので(例えば0.0000042132なら)、1023を10に 足す(0111111112)、0111111112はゼロ、それ以上は正、それ以下は負になります)。つまり、指数の逆数を求めるには、指数の11ビットの値から1023を引けばよい。

合計すると、私たちの番号891677.4025191は タイプ ダブルでは 次の ようになります。

0100000100101011001101100011101011001110000101101111101111000101

しかし、これは2進数表現なので、正確に10進数に変換してみよう。

ということは、891677.4025190999964252114295947265625と なります。


例2

0.00000145258556224114という10進数の数値があります。

この数字は2進数で表すことができる。

-0.000000000000000000011000010111101100111010110111010011010101001111001110

この数値の仮数を選択するには、コンマを20桁右に移動して、最初の単位の後にあるようにすればよい。

1.1000010111101100111010110111010011010101001111001110* 2-20

Мантисса =1000010111101100111010110111010011010101001111001110

指数 = (-20+1023)10=011111010112

マイナス符号なので、最初のビットは1です。

私たちの合計数-0.00000145258556224114は、ダブルタイプでは次のようになります。

1011111010111000010111101100111010110111010011010101001111001110

10進数に正確に変換します。

это будет-0.00000145258556224113991124017968015191826225418481044471263885498046875



この場合、0.01という数値は、複式で表現されるため、問題が発生します。

0 01111111000 0100011110101110000101000111101011100001010001111011

であり、10進数表記に換算すると、0.0100000000002081668171172168513294309377670288085937510に等しくなる。

一方、表現では

310= 1.5*2 = 1.12*2 1

510= 2.5*2 = 10.12*2 1

610= 1.5*4 = 1.12*2 2

710 = 3.5*2 = 11.12*2 1

問題ありません。

なぜ、倍の0.01という数字が本当に大きいのか?

その理由はこうです。

0 011111000 01000111101101010010111101110100101111011 - 0.01000000000000000020816681711721685132943093776702880859375 エラー = 0.000 000 000 000 000 000 208166817...

0 011111000 0100011110111000010101111010 - 0.009999999999984747344334119407569175064563751220703125 error = - 0.000 000 000 000 001 5265566...

このプロセスケミストリーを理解するために、以下の計算機で遊んでみてください:
https://babbage.cs.qc.cuny.edu/IEEE-754.old/Decimal.html

https://baseconvert.com/ieee-754-floating-point


https://baseconvert.com/ieee-754-floating-point


 

ありがとうございます、参考になります。まあ、基本的にはMQはあった方がいいのですが、補正不足なのか、判断がユーザーに委ねられているのか?

 

EAパラメータを保存するための機能、またはその他の追加機能(ライブラリ、コード)はありますか?

例えば、シンボル(追加機能は期間分析)上でEAを実行するときに、設定された設定ファイルを保存するようなondeinitのコードを入れることである。

例)-EA名-記号-ピリオド。

上書き可能なファイル - シンボルの最後の設定のみ。

例えば、テスターの標準設定は、最後に実行したときのものが保存されます。

 
ごきげんよう。 リモートPCでの問題ですが、MQL5のサイトにアクセスできないので、購入したインジケータを ダウンロードできません。MQL5のサイトに入れないため、購入したインジケータをダウンロードできない。
 
Slava Botalov:
こんにちは、リモートコンピューターで問題が発生しました。MQL5のウェブサイトにアクセスできないため、購入したインジケーターを ダウンロードすることができないのです。インジケーターをダウンロードできないので、使用できません。


が、Zomroのリモートコンピュータ?

 
x572intraday:

ありがとうございます、参考になります。まあ、基本的にはMQはあった方がいいが、補正不足か、ユーザーの判断に任されているのだろうか。

だから、もらえなかったんです。
間違いはありません。
すべては思いのまま。
 
Vladislav Andruschenko:


が、Zomroのリモートコンピュータ?

はい

 
Slava Botalov:
ごきげんよう。 リモートPCでの問題ですが、MQL5のサイトにアクセスできないので、購入したインジケータを ダウンロードできません。インジケータがダウンロードできないので、MQL5のサイトでインストールできない。
Vladislav Andruschenko:


が、Zomroのリモートコンピュータ?

スラバ・ボタロフ

はい


このプロバイダーは重大な違法行為で出入り禁止になって います

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

なぜ、www.mql4.com へのアクセスがブロックされているのですか?

レナート・ファットフーリン さん 2020.11.17 12:16

***

サブネットを持つZomroプロバイダー全体が、自分のサブネットから大量の不正行為を行ったとしてブロックされます。

***
 
Nikolai Semko:
だから、理解されないのです。
エラーは全くありません。
すべては思いのまま。

そういう問題じゃないんです。問題は、特にプログラマーではなく、トレーダーにとって、どこで役に立つのか、ということです。端末の価格表示でも発注画面でもそんな数字見たことない、どこも同じ(どこか5桁、どこか違う)。

 
Vladimir Karputov:


このプロバイダーは、重大な違法行為により追放されました。

残念ですが、他の製品に変更しなければなりません。 何か良い方法はありませんか?