/**
* Rotate a 32 bit integer value bit-wise
* the specified number of bits to the right.
* This function is needed for calculations
* in the hash function makeMacicNumber()
*/int bitRotate(intvalue, int count){
int i, tmp, mask;
mask = MathPow(2, count) - 1;
tmp = value & mask;
value = value >> count;
value = value | (tmp << (32 - count));
return(value);
}
MathPow()は必要ない、なぜ誰もこれに気づかなかったのか?
/**
* Rotate a 32 bit integer value bit-wise
* the specified number of bits to the right.
* This function is needed for calculations
* in the hash function makeMacicNumber()
*/int bitRotate(intvalue, int count){
int i, tmp, mask;
mask = (0x00000001 << count) - 1;
tmp = value & mask;
value = value >> count;
value = value | (tmp << (32 - count));
return(value);
}
コメントと同じで、ある種の数値コメントと捉えてください。通常のMT4ユーザーインターフェースで開いたすべてのマニュアル取引は、マジックナンバー0を持つので、例えば、すべての注文をループして、すべてのEA取引をそのままに、すべてのマニュアル取引と注文をクローズ/削除することができます。
1 つの特定の注文だけを一意に識別するために、チケット番号があります。
その点をクリアにして、意見を聞かせてくれてありがとうございます。 とても勉強になりました。
MathPow()は必要ない、なぜ誰もこれに気づかなかったのか?
最初の投稿を更新中です。
MathPow()は必要ない。なぜ誰もこれに気づかなかったんだ?
主な理由は3つあります。
明快さが失われるとは言いません。 私の主な意図は明快さ、優雅さ、正確さであり、パフォーマンスではありません。
ビット演算子を一切使わずに、べき乗、乗算、除算(およびモジュロ)を使って実際のビットシフトを行うことも可能です。しかし、エレガントさのために(そして明瞭さのために)、どちらか一方だけで行うべきで、両方を使うべきではありません。また、この関数の意味はビットをシフトすることなので、ビットシフトを乗算で行うと、コードが難解になるだけです。
また、足し算と掛け算は整数で行うことができますが、MathPow()関数は 内部で対数を使用しており、近似の臭いがして、私が必要とするものに比べて信じられないほど複雑です。
なぜこの ことに 気がつかなかった のか、という疑問を持つべきだったかもしれません。そもそもなぜMathPow()を使ってしまったのか?私はそれを知らない。最後にアセンブラをやったのは15年前だが、今ではより高い抽象度で問題を考えるのに慣れている。もしかしたら、これが原因だったのかもしれない。私の脳のどこかに、n番目のビットが2^nであることと強い結びつきがあり、私はそれを一秒も考えずに書き留めただけなのだ。アセンブラのプログラマーなら、こんなことは絶対にしなかっただろう。左シフトは2の乗算、2の乗算は左シフト。
私の永続性のための解決策は、私が使用するtf(10個)、注文を開いたエキスパートのバージョンまたは取引方法(4個)を保持するために、intの32ビットを使用することです。必要であれば、まだ多くのビットに余裕があります。私はこれを処理するためにビット演算といくつかの変換関数を 使用しています。他の人もこれと似たようなことをしていると思いますが、これではあなたの状況には不十分なようなので、私が質問したことについて、まだ頭を抱えています。
あなたの例では、Symbol()はどのようにMNの一部になるのでしょうか?EA番号とTimeframe番号がありますが、シンボルはどうするのでしょうか?
私はあなたのアプローチの利点を理解し、将来的にそれを利用するかもしれません。 しかし、私はNuBなので、MMをMQL4.Comのコードベースから利用しています。ですから、私のプログラミング学習曲線において、今の時点ではMMは優先順位が低いのです。 でも、もしもっといい方法があれば、MMが優先順位の一番上にくるまで、それを使うことに反対はしません。私たちNuBは、得られるすべての助けを必要としているのです。
名前とバージョン番号についてですが、MNでは数字のみで、文字は使えません。
私はあなたのコードを見ていませんが、あなたのアルゴリズムが名前をMNの一部に変換していると仮定すると、その場合、どの通貨ペアで対処しているかはすぐにはわかりません。
あなたのアルゴリズムは、名前をあなたのMNの一部に変換しています。その場合、どの通貨ペアを扱っているかは、すぐにはわかりません。
このアルゴリズムは、どんな文字列も確実にユニークな整数の数値に変換します。この変換は一方通行ですが、私は決してそれを戻すために変換する必要があります。
私が知る必要があるのは、同じ番号を持つこれらの取引が一緒に属しているということだけです。 これは、ループ内のたった一つのif()で、この特定のEA/シンボル/TFの組み合わせのすべてのトレードを簡単に見つけるためのID番号に過ぎません。この番号について知っておかなければならない唯一のことは、各EA/シンボル/時間枠の組み合わせに対して一意であることと、決定論的であり、私のPCがクラッシュすることになったとしても変更されないということです。
論理的に一緒になっているすべての取引は、同じMNを持つことになります。後日、どのシンボルで行われたかを知る必要がある場合(例えば月末の統計)、これらの注文にOrderSymbol()を使うだけでよいのです。
なぜ、同じtfとシンボルを同じ設定で実行する複数のエキスパートが必要なのでしょうか?
私の永続性のための解決策は、私が使用するtf(10個)、注文を開いたエキスパートのバージョンまたは取引方法(4個)を保持するために、intの32ビットを使用することです。必要であれば、まだ多くのビットに余裕があります。私はこれを処理するためにビット演算といくつかの変換関数を使用しています。他の人もこれと似たようなことをしていると思いますが、これではあなたの状況には不十分なようなので、私はまだ質問したことについて理解しようとしているところです。
他の人のことは言えませんが、私のEAは注文を閉じるのに時間がかかることがあり、前の注文がまだ閉じられていないため、新しいエントリーポイントを逃します。 私は、各エントリーを独立して処理し、各トレードのルール(移動SL、tpに最初に達したときに半分を閉じる、など)に従って各トレードに従うようにしてほしいと思っています。
私は他の人のために話すことはできませんが、私は注文を閉じるためにしばらく時間がかかることができ、それはまだ前の注文から閉じていないため、新しいエントリポイントを逃すEAを持っています。 私は、各エントリーを独立して処理し、各トレードのルール(移動スル、tpに最初に達したときに半分を閉じる、など)に従って各トレードに従うようにしてほしいと思っています。なるほど。では、サーバーの応答待ちで拘束され、その間に他の注文を開けることができるのですね。
でも、取引コンテキストがビジー状態だと、注文に関する動作が停止するのでは?
動けばそれでいいんだろうけど。
サーバーの応答というより、注文を開いたままにしておくことです。つまり、EAが買いシグナル を受信して買い、そして開いたままにしておく。数時間後、別の買いシグナルが来たが、すでにオープンポジションを持っているので、最初の注文をクローズするのを待っているため、買わなかったとします。しかし、最初の買いシグナルが2つ目よりも利益を生むと仮定する理由はありませんし、EAが追加の注文を出す前に最初の注文の決済を待つことによって何か得るものがあるとも思えません。 しかし、私はまだそれに取り組んでいるので、私にとってはまだ理論なのです:)