マジックナンバーの作成 - ページ 4

 
7bit:

コメントと同じで、ある種の数値コメントと捉えてください。通常のMT4ユーザーインターフェースで開いたすべてのマニュアル取引は、マジックナンバー0を持つので、例えば、すべての注文をループして、すべてのEA取引をそのままに、すべてのマニュアル取引と注文をクローズ/削除することができます。

1 つの特定の注文だけを一意に識別するために、チケット番号があります。

その点をクリアにして、意見を聞かせてくれてありがとうございます。 とても勉強になりました。

 
7bit:
/**
* 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(int value, 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(int value, int count){
   int i, tmp, mask;
   mask = (0x00000001 << count) - 1;
   tmp = value & mask;
   value = value >> count;
   value = value | (tmp << (32 - count));
   return(value);
}
最初の投稿を更新中です。
 
7bit:
MathPow()は必要ない。なぜ誰もこれに気づかなかったんだ?

主な理由は3つあります。

  • すでにハッシュ関数を使って いる人は、それをあなたのコードに置き換えることはないでしょうから、あなたのコードの詳細には関心を持たないでしょう。
  • 現在ハッシュ関数を使っていないが、それが良いアイデアかもしれないと考えている人は、おそらくあなたのようなコードをただ信用し、それが動作するかどうかだけを気にし、それがどれだけエレガントで最適化されているかは気にしないでしょう。
  • MathPow()をビット演算に置き換えることで、makeMagicNumber()を1回呼び出すごとにミリ秒以下の大幅な時間短縮が可能になります。あなたは、makeMagicNumber()はEAのライフタイム中、init()の中で一度だけ呼ばれることを示唆しています。したがって、この変更によって節約できるのは、EA の寿命あたり 1 ミリ秒未満です。これはまったく些細な変更です(そして間違いなくコードの明瞭性を低下させます)。
 
jjc: 間違いなく、コードの明瞭性を低下させます

明快さが失われるとは言いません。 私の主な意図は明快さ、優雅さ、正確さであり、パフォーマンスではありません。

ビット演算子を一切使わずに、べき乗、乗算、除算(およびモジュロ)を使って実際のビットシフトを行うことも可能です。しかし、エレガントさのために(そして明瞭さのために)、どちらか一方だけで行うべきで、両方を使うべきではありません。また、この関数の意味はビットをシフトすることなので、ビットシフトを乗算で行うと、コードが難解になるだけです。

また、足し算と掛け算は整数で行うことができますが、MathPow()関数は 内部で対数を使用しており、近似の臭いがして、私が必要とするものに比べて信じられないほど複雑です。

なぜこの ことに 気がつかなかった のか、という疑問を持つべきだったかもしれません。そもそもなぜMathPow()を使ってしまったのか?私はそれを知らない。最後にアセンブラをやったのは15年前だが、今ではより高い抽象度で問題を考えるのに慣れている。もしかしたら、これが原因だったのかもしれない。私の脳のどこかに、n番目のビットが2^nであることと強い結びつきがあり、私はそれを一秒も考えずに書き留めただけなのだ。アセンブラのプログラマーなら、こんなことは絶対にしなかっただろう。左シフトは2の乗算、2の乗算は左シフト。

 
なぜ、同じtfとシンボルを同じ設定で実行する複数のエキスパートが必要なのでしょうか?

私の永続性のための解決策は、私が使用するtf(10個)、注文を開いたエキスパートのバージョンまたは取引方法(4個)を保持するために、intの32ビットを使用することです。必要であれば、まだ多くのビットに余裕があります。私はこれを処理するためにビット演算といくつかの変換関数を 使用しています。他の人もこれと似たようなことをしていると思いますが、これではあなたの状況には不十分なようなので、私が質問したことについて、まだ頭を抱えています。
 
7bit:

あなたの例では、Symbol()はどのようにMNの一部になるのでしょうか?EA番号とTimeframe番号がありますが、シンボルはどうするのでしょうか?

それはないのですが、私が使っているマネーマネジメントはMNをベースにしています。この場合、MMがすべてのオープントレードを考慮に入れるために、すべて同じにする必要があります。トレードコメント欄には常にバージョンと優先順位を含むEAを記入し、開発中のEAがどのバージョンとタイムフレームを使用しているかを把握し、MQL4Strategy Testerに ログインしてトレード#、通貨ペア、コメント欄でソートできるようにしています。 ジャーナルを見ると、どの通貨で取引されたかがわかります。 分析するためにExcelに転送すると、好きなフィールドでソートすることができます。
私はあなたのアプローチの利点を理解し、将来的にそれを利用するかもしれません。 しかし、私はNuBなので、MMをMQL4.Comのコードベースから利用しています。ですから、私のプログラミング学習曲線において、今の時点ではMMは優先順位が低いのです。 でも、もしもっといい方法があれば、MMが優先順位の一番上にくるまで、それを使うことに反対はしません。私たちNuBは、得られるすべての助けを必要としているのです。
名前とバージョン番号についてですが、MNでは数字のみで、文字は使えません。
私はあなたのコードを見ていませんが、あなたのアルゴリズムが名前をMNの一部に変換していると仮定すると、その場合、どの通貨ペアで対処しているかはすぐにはわかりません。
 
FourX:
あなたのアルゴリズムは、名前をあなたのMNの一部に変換しています。その場合、どの通貨ペアを扱っているかは、すぐにはわかりません。

このアルゴリズムは、どんな文字列も確実にユニークな整数の数値に変換します。この変換は一方通行ですが、私は決してそれを戻すために変換する必要があります。

私が知る必要があるのは、同じ番号を持つこれらの取引が一緒に属しているということだけです。 これは、ループ内のたった一つのif()で、この特定のEA/シンボル/TFの組み合わせのすべてのトレードを簡単に見つけるためのID番号に過ぎません。この番号について知っておかなければならない唯一のことは、各EA/シンボル/時間枠の組み合わせに対して一意であることと、決定論的であり、私のPCがクラッシュすることになったとしても変更されないということです。

論理的に一緒になっているすべての取引は、同じMNを持つことになります。後日、どのシンボルで行われたかを知る必要がある場合(例えば月末の統計)、これらの注文にOrderSymbol()を使うだけでよいのです。

 
circlesquares wrote>>
なぜ、同じtfとシンボルを同じ設定で実行する複数のエキスパートが必要なのでしょうか?

私の永続性のための解決策は、私が使用するtf(10個)、注文を開いたエキスパートのバージョンまたは取引方法(4個)を保持するために、intの32ビットを使用することです。必要であれば、まだ多くのビットに余裕があります。私はこれを処理するためにビット演算といくつかの変換関数を使用しています。他の人もこれと似たようなことをしていると思いますが、これではあなたの状況には不十分なようなので、私はまだ質問したことについて理解しようとしているところです。


他の人のことは言えませんが、私のEAは注文を閉じるのに時間がかかることがあり、前の注文がまだ閉じられていないため、新しいエントリーポイントを逃します。 私は、各エントリーを独立して処理し、各トレードのルール(移動SL、tpに最初に達したときに半分を閉じる、など)に従って各トレードに従うようにしてほしいと思っています。
 
joetrader:


私は他の人のために話すことはできませんが、私は注文を閉じるためにしばらく時間がかかることができ、それはまだ前の注文から閉じていないため、新しいエントリポイントを逃すEAを持っています。 私は、各エントリーを独立して処理し、各トレードのルール(移動スル、tpに最初に達したときに半分を閉じる、など)に従って各トレードに従うようにしてほしいと思っています。

なるほど。では、サーバーの応答待ちで拘束され、その間に他の注文を開けることができるのですね。

でも、取引コンテキストがビジー状態だと、注文に関する動作が停止するのでは?

動けばそれでいいんだろうけど。

 

サーバーの応答というより、注文を開いたままにしておくことです。つまり、EAが買いシグナル を受信して買い、そして開いたままにしておく。数時間後、別の買いシグナルが来たが、すでにオープンポジションを持っているので、最初の注文をクローズするのを待っているため、買わなかったとします。しかし、最初の買いシグナルが2つ目よりも利益を生むと仮定する理由はありませんし、EAが追加の注文を出す前に最初の注文の決済を待つことによって何か得るものがあるとも思えません。 しかし、私はまだそれに取り組んでいるので、私にとってはまだ理論なのです:)