記事"MetaTrader 5のマルチ通貨モードの実行"についてのディスカッション - ページ 3

 
Lizar:

16進数のロジックはどこでも同じです。数体系についてはこちらを ご覧ください。そこでは位置数システムについて読むことができ、16進数や2進数への言及を見ることができる。そこには、システムからシステムへの変換の例がもっとある。

すべてのビット演算は2進法を対象としています。MQL5でのビット演算についてはこちら

これらの記事は、すでに何を言っているのかわかっているときに読むとよいでしょう :)

例えば、あなたは列挙で接頭辞 "0x "を使用しています。私が理解する限り、これは16進数が記述されていることを意味し、"(flag_event & CHARTEVENT_NEWBAR_M1)!=0" という式は "bitwise AND" 演算を使用しています。ビット演算は2進法を想定していると書かれていますね。では、(2進法用の)&演算子は16進数とどのように関係するのでしょうか?

もう一つの質問:私の理解が正しければ、「(flag_event & CHARTEVENT_NEWBAR_M1)!=0」という式は「flag_event !"= CHARTEVENT_NEWBAR_M1」という式と等価です。これは正しいのでしょうか?もしそうなら、なぜビット演算を使うのですか?

 

Вы же пишите, что побитовые операции предназначены для двоичной системы

CPU内部の数値は2進数だ。

だから、頭の中で255やFFを「見て」、それを8や0x00000100と比較したとしても、違いはない。


イェデルキン

私の理解が正しければ、"(flag_event & CHARTEVENT_NEWBAR_M1)!=0" という表現は、"flag_event !"= CHARTEVENT_NEWBAR_M1" という表現と同じです。これは正しいのでしょうか?もしそうなら、なぜビット演算を使うのですか?

しかし、ビット演算は比較よりも応用範囲が広く、一般的です。特に、定数を扱うときにはビット演算を使うのが古典的な振る舞いとなっています。
 
sergeev:

CPU内部の数字はバイナリなんだ。

ですから、255やFFを頭の中で「見て」、8や0x00000100と比較したとしても、違いはありません。

違いは用語的なものだ。しかし、あなたの言葉から、プログラマーにとってはどうでもいいことだと理解しました。

セルゲイエフ

しかし、ビット演算は単なる比較よりも応用範囲が広く、より一般的なものです。特に、定数を扱うときにはビット演算を使うのが古典的な振る舞いとなっています。

なるほど!つまり、ビット演算に少し慣れていなくても、比較演算子を使って式を書き換えても大丈夫ということですね。分かりやすく説明してくれてありがとう!

 
Yedelkin:

この手の記事は、すでに内容を知っているときに読むといい)

例えば、あなたは列挙に接頭辞 "0x "を使っています。私が理解する限り、これは16進数が書かれていることを意味し、「(flag_event & CHARTEVENT_NEWBAR_M1)!=0」という式は「ビットごとのAND演算」を使用しています。ビット演算は2進法を想定していると書かれていますね。では、(2進法用の)&演算子と16進数との関係はどうなるのでしょうか?

これらのシステムはすべて、視覚的に異なる方法で数字を表現しているだけなので、ある数字が10であれば、それはどこでも10なのです。カンプの場合、どのようなシステムで数字を書こうと、すべての数字は2進数に変換される。私が書くこれらの文字でさえ、2進数に変換される。他のシステムでは、数字は主に分かりやすくするため、あるいは習慣的にラベルを付ける。まあ、賢く見せるためにそうする人もいる。この場合、16進数が使われるのは、文章をコンパクトにするため、まあ、わかりやすくするためだ。16進数がどのように形成されるかを知ることで、見やすさが生まれる。

もう一つの質問:私の理解が正しければ、"(flag_event & CHARTEVENT_NEWBAR_M1)!"=0"という表現は、"flag_event !"= CHARTEVENT_NEWBAR_M1"という表現と等価です。これは正しいのでしょうか?もしそうなら、なぜビット演算を使うのですか?

いいえ、必ずしもそうとは限りません。flag_eventに何が書かれているかによります。CHARTEVENT_NEWBAR_M1だけが flag_event に書き込まれた場合、flag_event = CHARTEVENT_NEWBAR_M1 です。CHARTEVENT_NEWBAR_M1|CHARTEVENT_NEWBAR_M5flag_event 書き込ま れた場合、flag_event != CHARTEVENT_NEWBAR_M1 となります。しかし、どちらの場合も条件 (flag_event & CHARTEVENT_NEWBAR_M1)=0が満たされます

もし、flag_event 、CHARTEVENT_NEWBAR_M5と書くと 、flag_event != CHARTEVENT_NEWBAR_M1 となります。 しかし、 (flag_event & CHARTEVENT_NEWBAR_M1)=0 となります

これらのトリックを理解するには、数システムとビット演算を理解する必要がある。そうでなければ死んでしまう。

 
Yedelkin:

なるほど!つまり、ビット演算を使うのはちょっと珍しいとしても、比較演算子を使って式を書き換えても大丈夫ということですね?ご説明ありがとうございます!

いつでも置き換えることはできますが、追加の計算が必要になるかもしれません。この場合は注意してください :)。
 
Lizar:
いつでも交換することはできますが、追加の計算が必要になるかもしれません。この場合は注意してください :)。

わかりました!もう一つ質問がある。16進数を書くときに2の位を使いますが、2の位を使うことに意味があるのでしょうか、それとも習慣の問題なのでしょうか?例えば、0x00000003, 0x00000009, などの組み合わせは使えますか?

 
Yedelkin:

オーケー!もう一つ質問です。16進数を書くとき、2進数を使いますよね。 2進数を使うことに意味があるのでしょうか、それとも習慣の問題なのでしょうか?例えば、0x00000003、0x00000009などの組み合わせは使えるのでしょうか?

いいえ、これはビット演算の 使用によるものです。スパイでは(flag_eventで)1つの数値に複数の数値(イベント)を追加し、EAでは1つの数値から複数の数値を取り出し、スパイが送信したイベントを確認します。その逆もしかり。

あ、よく読んでなかった。そうです。ただし、1つの数字がすべてのイベントに当てはまるとは限りません。2進数を使っているのは、2進数を16進数で書いているからです。各ビットは異なるイベントを表します。

 
脱帽だよ、諸君 :)真の傑作だ。シンプルかつエレガントでパワフルなソリューションだ。本当にありがとう、コンスタンチン。)
 

デフォルトでは、price[rates_total-1]は最後の未完了バーの終値に等しく、これは最後の買値に等しい。

アスク価格を強制的に取得したい場合は、例えばこの行を以下のように置き換えてください。


この関数は、価格イベントだけでなく、例えば次のようなイベントも Expert Advisor に渡すことができますか?

例えば、インジケーターのイベントや、他のインストゥルメントからのそれらの組み合わせ/バリエーション、つまり、シグナルがすでにそこで受信されているかのように。もし可能であれば、どのように実装すればよいでしょうか。

ご回答ありがとうございました。

 
artall:

デフォルトでは、price[rates_total-1]は最後の未完了バーの終値に等しく、これは最後の買値に等しい。

アスク価格を強制的に取得したい場合は、例えばこの行を以下のように置き換えます。


この関数は、価格イベントだけでなく、例えば以下のようなイベントも Expert Advisor に渡すことができますか?

例えば、インジケータのイベントや、他のインストゥルメントからのそれらの組み合わせ/バリエーション、つまり、シグナルがすでにそこで受信されているかのように。もし可能であれば、どのように実装すればよいでしょうか。

回答ありがとうございます。


この目的のためには、インジケーター自体に標準関数EventChartCustomを 適切な場所に埋め込んで使用するのがよいでしょう。