オートマチックマジックナンバー - ページ 4

 
cloudbreaker:

私は、(非常に簡潔に)文書化することが有用であろうと考えさせられました。

1.マジックナンバーの実装を決定する基準

2.マジックナンバーの自動生成を行うかどうかの判断基準

3.永続化レイヤーの実装を決定するための基準

4.永続化のためにグローバルかファイルアクセスかを決定する基準

簡単に、完全に個人的な回答ですが...


(2)は、ユーザーがマジック・ナンバーを制御して、異なる戦略の結果をグループ化する方法として使用したいかどうかなど、多くの要因に依存します。

(3)は、できることなら避けたいところですが、ほとんどできません(「外部変数と時間枠の変更?) MT4がEAの状態を永続化し、回復する手助けをしてくれればいいのですが。しかし、それはない。

(4)は、かなり強い個人的な好みにつながります。私はグローバルが好きではありません。ユーザーが削除できること、ストレージが数字に限定されていること、gvariables.datのフォーマットが不明瞭であること、などです。私は、必要であれば最後の手段として、テキストエディタで変更できるファイルの方がずっと好きです。


- しばらくお休みする前に、あと8投稿を残すのみとなりました。

マジックナンバーを達成したようですね。少なくとも、あなたがいるところは暖かくなりそうです....

 

このアイデアを何度も練り直し、やっと思い通りにできるようになりました。これは、シンボルのASCIIコードを取り、それをタイムフレームとカスタムコードに追加して、タイムフレーム、シンボル、EAに固有のマジックナンバーを生成するマジックナンバージェネレータです。もし、EAが自分の名前を読み取る方法を知っていたら、カスタムコードの代わりにそのASCIIを使うでしょう。この弱点があっても、上記の基準には合っていると思います。システムクラッシュがあっても、システム再起動時に以前選んだのと同じ番号を選ぶので大丈夫でしょう。弱点は、同じ時間枠とシンボルで同じEAの複数のインスタンスを取引する場合、それは重複したマジックナンバーを選択することであると私は見ることができます。

以下は、私が持っているものです。

string GetSymbol=Symbol();
int MNSymbol,MNSymbolCalc,MagicNumber;
for(int a=0;a<6;a++)//turn the Symbol() into an ASCII string and add each character into MNSymbol
{
MNSymbolCalc=StringGetChar(GetSymbol, a);
MNSymbolCalc=((MNSymbolCalc-64)*(MathPow(10,(a)));//subtract 64 b/c ASCII characters start at 65, multiply result by the a-th power for neatness (though unnecessary)
MNSymbol = MNSymbol+MNSymbolCalc;
} } MNSymbolCalc=MNSymbol+MNSymbolCalc; } MNSymbolCalc=(MNSymbol-Calc)
int MNPeriod=Period()。

int MNEACode=100000;//異なる種類のEAが同じマジックナンバーを選択しないように、この数字をEAごとに異なるものにする
MagicNumber=MNSymbol+MNPeriod+MNEACode.MNSymbol=MNSymbol+MNPeriod+MNEACode;

 

JT、そうです...重複の「問題」は悪夢のようなものです ;)


あなたや多くの人がそうであるように、一意性の 問題は常に繰り返されるテーマで、いつでも攻撃されるのですが、どういうわけか決して正しいとは 思えません!

このスレッドで以前に公開された私のコードは、(大笑いするため以外の理由がないのであれば)役に立つかもしれない以下のものに置き換えられました。

***ビルトインへの呼び出しによって利用可能なEA名文字列に注意してください。

マルチccy,perを作るために、ローカル関数が 使用されています。つまり、空のactuals: ccy,perをチェックするためにいつも同じ関数ヘッダーコードをコーディングすることにうんざりしていたのです。

というわけで、_Symbol()と_Period()を使っています。スピードとサイズを考えると、MT4でもインタプリタにこだわる価値はないと思うのですが...。

とにかく、これは考えるための材料になるかもしれない...


以下のようなことをする私の理由は、[そして関数でドキュメント化]です。

これは、あるEAがCCY,PERで停止した場合、後で同じCCY,PERに対して再実行する際に、確実に同じgiExperを生成する便利な方法です。

同じgiExpertId (aka, Magic#)を生成します。つまり、プール内の未決済取引の管理を再開することができる...

別の名前のついたEAを同じチャート環境で動作させても、値が重複する心配がない。

したがって、OrderPoolsはEA固有のマジック#を持つチケットを持ち、そのチケットのEAごとのマッピングを可能にします。


同じccy,perに1つの「同じ名前の」EAというのは、確かに問題ですね。私は最終的に、「おい、現実を見ろよ...もしこのミスを犯したら、考えなしなので、後ろから蹴られるのが当然だ」と決心しました(笑)

結局のところ、このスレッドにあるように、何十種類ものアイデアや方法があり、それぞれに長所と短所があるのです。

EAが動作するたびに、少なくとも1つのユニークなデータを 取得する必要があり、それが核心的な問題です。

EA/CTのクラッシュが再起動につながることについては、あまり考えたことがありませんし、中断したところを再開することについては、悩みの種でした。EAがEAid/magic#をそのR/Tチャート環境に固有の データで自動生成する限り、それはもう解決されました。いつまで経っても同じ数字が出る...。

まあ、楽しんでください。


int iMakeExpertId (string sSymbol="",int iPeriod=EMPTY)
{

  return( iMakeHash(_Symbol( sSymbol), getPeriodStr(_Period( iPeriod)),WindowExpertName()) );

}//iMakeExpertId()
//
//
//


//+------------------------------------------------------------------+
//
int iMakeHash (string s1, string s2= EMPTYSTRING, string s3= EMPTYSTRING, string s4= EMPTYSTRING, string s5= EMPTYSTRING
			,string s6= EMPTYSTRING, string s7= EMPTYSTRING, string s8= EMPTYSTRING, string s9= EMPTYSTRING, string s10= EMPTYSTRING)
{
  /*
  Produce 32bit int hash code from  a string composed of up to TEN concatenated input strings.
  WebRef: http://www.cse.yorku.ca/~oz/hash.html
  KeyWrd: "djb2"
  FirstParaOnPage:
  "  Hash Functions
  A comprehensive collection of hash functions, a hash visualiser and some test results [see Mckenzie
  et al. Selecting a Hashing Algorithm, SP&E 20(2):209-224, Feb 1990] will be available someday. If
  you just want to have a good hash function, and cannot wait, djb2 is one of the best string hash
  functions i know. it has excellent distribution and speed on many different sets of keys and table
  sizes. you are not likely to do better with one of the "well known" functions such as PJW, K&R[1],
  etc. Also see tpop pp. 126 for graphing hash functions.
  "

  NOTES: 
  0. WARNING - mql4 strings maxlen=255 so... unless code changed to deal with up to 10 string parameters
     the total length of contactenated string must be <=255
  1. C source uses "unsigned [char|long]", not in MQL4 syntax
  2. When you hash a value, you cannot 'unhash' it. Hashing is a one-way process.
     Using traditional symetric encryption techniques (such as Triple-DES) provide the reversible encryption behaviour you require.
     Ref:http://forums.asp.net/t/886426.aspx subj:Unhash password when using NT Security poster:Participant
  //
  Downside?
  original code uses UNSIGNED - MQL4 not support this, presume could use type double and then cast back to type int.
*/
  string s = StringConcatenate( s1, s2, s3, s4, s5, s6, s7, s8, s9, s10);
  int iHash = 5381;
  int iLast = StringLen( s)-1;
  int iPos=0;

  while( iPos <= iLast )		//while (c = *str++)	[ consume str bytes until EOS hit {myWord! isn't C concise! Pity MQL4 is"!"} ]
  {
    //original C code: hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
    iHash = (( iHash << 5) + iHash) + StringGetChar( s, iPos);		//StringGetChar() returns int
    iPos++;
  }
  return(MathAbs( iHash));
}//iMakeHash()
 
fbj:
  NOTES: 
  0. WARNING - mql4 strings maxlen=255 so... unless code changed to deal with up to 10 string parameters
     the total length of contactenated string must be <=255

私は個人的にマジックナンバーの手動設定を好みますが、あなたの解決策は非常にエレガントです。いいコードですね。


ひとつ訂正があります。文字列定数の 最大長は255ですが、文字列変数は もっと大きくできます。参照 ->https://www.mql5.com/en/forum/123551.

 

Gordonさん、ありがとうございます。このコードは一見 うまくいっているように見えますが、同じチャート環境で同じEAを実行した場合、結局は弾丸プルーフではないのです。


私は、文字列はいつも面倒くさいです。でも、下位のツールの機能を利用しながら、徐々にツール群を構築していくことで、ほとんどのことが可能になります。

さらに、irusoh1が「これでいいんだ」と言ったのを覚えています...。まあ、私にとっては、彼の投稿 内容の最初のパラグラフを常に覚えていて、MTで生きるための緩いポイントに到達するたびに、常に*私の頭の中にあるのですが :))


MQL4 online/offlineでは、基本的なデータ型について書かれています。文字列のリンクはどちらも文字列定数に 行くのですが、そのドキュメントページには255bytesと書いてあるんです。

私はあなたが言っていることを完全に理解していますが、29373のスレッドは、MQL4のランタイムの文字列の取り扱いと同様に、結論が出ず、jjcや他の多くの人が経験しているように、どこかあやふや です。

8バイト構造体のフォーマットをフルに活用するためのドキュメントが見つからないのですが、より長い文字列をサポートするドキュメントがあれば教えてください。

とにかく、私は過去に文字列を使用して解決できない問題が発生したことがあるので、ドキュメントに書かれていることに忠実で、必要であれば、それを回避することを好みます。

 
fbj:

MQL4オンライン/オフラインでは、基本的なデータ型について説明しています。文字列のリンクは両方とも文字列定数に 行くのですが、そのドキュメントページには255bytesと書いてありますね。

29373のスレッドは、MQL4のランタイムの文字列処理と同様に、結論が出ず、jjcや他の多くの人が経験しているように、やや不安定 です。

8バイト構造体のフォーマットをフルに活用するためのドキュメントが見つからないのですが、より長い文字列をサポートするドキュメントがあれば教えてください。

とにかく、私は過去に文字列を使用して解決できない問題が発生したことがあるので、ドキュメントに書かれていることに忠実で、必要であればそれを回避することを好みます。

最大255にこだわることが安全な解決策であることは明らかですが、私はこの制限を無視したコードをかなりたくさん持っていますが、これまで問題に遭遇したことはありません。しかし、このコードはほとんど重要ではありません。

私はドキュメントがこの主題について少し不明瞭であることを知っているが、あなたがロシアのフォーラムをブラウズしようとすると(Google翻訳で)、私は文字列変数が255バイト以上をサポートしているというモデレータのいずれかによる公式コメントを読んだことを覚えているが、私は今それを見つけることができないようです...まあ、「これでいいのだ」と思って、我慢するしかないのでしょうけど :)

 
fbj:

8バイト構造体のフォーマットをフルに活用するためのドキュメントを見つけることができませんが、より長い文字列をサポートするドキュメントがあれば、興味を持つでしょう。

とにかく、私は過去に文字列を使用して解決できない問題が発生したことがあるので、ドキュメントに書かれていることに忠実で、必要であればそれを回避したいのです。

「文字列定数の長さは、0文字から255 文字の間です。文字列定数がこれより長い場合、右側の余分な文字は拒否され、コンパイラはそれに応じて警告を発します。

その内部表現は、8バイトの 構造体である。構造体の最初の要素は,その行に割り当てられたバッファのサイズを表す長整数である。構造体の2番目の要素は、その行を含むバッファの32階アドレスです。

MetaEditor辞書 データ型 - 文字列定数 より引用。

魅力的なものばかりだ...

 

このスレッドが古いことは知っていますが、私は誰もが「マジックナンバー」またはあなたがそれを呼びたいものを取得するためにそこに独自の方法を持っている参照してください。また、ある人は自分のEAが自分の名前を読めるようにしたいと言っているのを見ました。

EAのトップにこれを置きます。

#define EAName "ここにEAの名前を入れてください"

未決済の注文をチェック するときは、これを配置します。

if (OrderType() <= OP_SELL && OrderSymbol() == Symbol() && OrderComment() == EAName && OrderMagicNumber() == MagicNumber)

売買が成立したときに、このようにコメントにEANameを入れるようにします。

チケット = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, EAName, MagicNumber, 0, Blue)のように、コメントとしてEANameを置くようにします。

次に、同じペアで異なるTFのEAを同時に実行したい場合、マジックナンバーが必要な場合は.........次のようにします。

int MagicNumber = Period();