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

 
jjc:

私はここで何かを見逃しています。例えばUSDJPY H1のチャートを2つ開き、それぞれにEAのインスタンスを追加すると、両方ともマジックナンバー9999033を使用します。

はい、そのオプションは、私がそれを使用することがなかったので、それに組み込まれていません。2つのチャートを区別する唯一の可能性は、(私が見る限り)ウィンドウハンドルでハッシュ化することでしょう...。

しかし、その場合、再スタートやチャートクローズ 時の持続性が失われ、その結果、孤児となった注文が作成される可能性があります。

 
BarrowBoy:

では、MT端末のアプリケーションは、<全体>に対して1つのhWndを持つ「コンテナ」なのでしょうか。

はい、これはかなり典型的なMDIアプリケーションです。トップレベルのウィンドウには、ツールバー、ペイン、MDIクライアント・エリアなどがあります。後者には各チャートがあり、各チャートは実際には2つのウィンドウで構成されています:コンテナとその中の描画エリアです。これらのものにはそれぞれ hWnd ハンドルがあります。WindowHandle()関数は 描画エリアのハンドルを返すので、GetParent() API コールを 3 回使用すると、トップレベルの MT4 ウィンドウの hWnd が得られます。

 

参考までに、私は下記を使用していますが、重複したことはありません。同じEAを最大10枚のチャートに表示させることができます。

ハッシュ関数に 渡される大量のジャンクアクチュアルに対する答えはない。私はただ、キッチンシンクを含むすべてを押し込んだだけです。

明らかに、私はより良い、より記述可能な/論理的な 方法を持ちたいと思います...だから、それをバラバラにし始めなさい:O)

#define EMPTYSTRING     ""
#define EAIDMIN         1
#define EAIDMAX         21473


  //+------------------------------------------------------------------+
//
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 string 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
  //
  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 {isn't C concise!} ]
  {
    //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()




  //+------------------------------------------------------------------+
//
int iMakeExpertId ()
{
  int i1a,i2a,i1b,i2b;
  int iExpertId = EAIDMAX+1;
  while(iExpertId<EAIDMIN || iExpertId>EAIDMAX)
  {
    i1a=TimeLocal(); i2a=GetTickCount();
    Sleep(500);
    i1b=TimeLocal(); i2b=GetTickCount();
    MathSrand(iMakeHash(Symbol()
                        ,DoubleToStr(Period(),Digits)
                        ,DoubleToStr(i2a*WindowBarsPerChart()/Period(),Digits-1)
                        ,DoubleToStr(WindowTimeOnDropped()/i2b,Digits+1)
                        ,StringConcatenate(i2a/Period()
                                          ,Symbol()
                                          ,Period()
                                          ,i1a
                                          ,i2b*WindowBarsPerChart()/Period()
                                          ,i1b/WindowBarsPerChart()
                                          ,WindowTimeOnDropped()
                                          )
                        )
              );

    iExpertId = MathRand();  //here, on 2nd rand call, is even btr (tests seem to say this...)
  }

  return(iExpertId);

}//iMakeExpertId()

daaaaamn... these results are when had diff EAIDMAX! Anyway, just can't get the staff these days 0 lol
  /*test extract:
12:06:22 "EXPERT ID = "19736
12:06:21 "EXPERT ID = "16236
12:06:20 "EXPERT ID = "4633
12:06:19 "EXPERT ID = "26753
12:06:18 "EXPERT ID = "28286
12:06:16 "EXPERT ID = "23335
12:06:15 "EXPERT ID = "4036
12:06:14 "EXPERT ID = "12879
12:06:13 "EXPERT ID = "8095

12:06:08 "EXPERT ID = "7940
12:06:07 "EXPERT ID = "10700
12:06:06 "EXPERT ID = "24889
12:06:05 "EXPERT ID = "16055
12:06:04 "EXPERT ID = "12774
12:06:03 "EXPERT ID = "10058
12:06:02 "EXPERT ID = "29346
12:06:01 "EXPERT ID = "14624
12:06:00 "EXPERT ID = "18432
*/
 
fbj:

参考までに、私は下記を使用していますが、重複したことはありません。同じEAを最大10枚のチャートに表示させることができます。

ハッシュ関数に渡される大量のジャンクアクチュアルに対する答えはない。私はただ、キッチンシンクを含むすべてを押し込んだだけです。

明らかに、私はより良い、より説明可能な/論理的な 方法を持ちたいと思います...だから、それを粉々に引き裂くことを始めてください:O)

私はそれが好きです。特に古き良きdjb2ハッシュが。

 

非常に印象的なものです。)

MDIコンテナは、私を連れ戻す <sigh> 。

IMHOでは、マジックナンバーはランダムに適用するにはあまりにも重要 だと言っています。

再起動時に予測可能なリカバリは、堅牢なシステムにおいて非常に重要な要素であることは、CBも認めるところでしょう...。

FWIW

-BB-

 

このコードで、プラットフォームがシャットダウンしてもEAは自分の注文を認識することができます。グローバル変数を使っているので、PCのシャットダウンに反応するEAにしたい場合は、グローバル変数の代わりにファイルを 使うように書き換えることができます。1Mのタイムフレームでエキスパートをロードし、メタトレーダーをシャットダウンしてから再びロードし、次のバーでEAがどのように注文をクローズするかを確認することができます。複数のグラフで証明したわけでも、複数の注文で騙したわけでもありませんが、どうでしょうか?

int MagicNumber;
 
int init()
{
   // Unique sting id.    
   string id = WindowExpertName() + Symbol() + Period();
    
    
   // If there isn't already a Global Variable with the id in wich search for the MagicNumber create it  
   if(!GlobalVariableCheck( id))
   {
      MagicNumber = WindowHandle(Symbol(),0);   
      GlobalVariableSet( id, MagicNumber);
   }
   else // Just get the MagicNumber for the unique id
   {
      MagicNumber = GlobalVariableGet( id);
   }
      
}
ファイル:
 
jjc wrote>>

好きなんです。特に古き良き時代のdjb2ハッシュが。

ありがとうございます - しかし、私は本当にmakeexpertidでこのような無知なコーディングをしたことを後悔しています...

まだ早いですが、もしかしたら誰かが欠点を見つけて くれるかもしれません...あるはずです。

 
BarrowBoy wrote>>

非常に印象的なものです。)

MDIコンテナは、私を連れ戻す <sigh> 。

IMHOでは、マジックナンバーはランダムに適用するにはあまりにも重要だと言っています。

再起動時に予測可能なリカバリは、堅牢なシステムにおいて非常に重要な要素であることは、CBも認めるところでしょう...。


FWIW

-BB-

私はまだ、IMHO、マジックナンバーはランダムに適用するにはあまりにも重要であると言います

確かにBBは、Vip Datumsです。私は、あるEAの複数のインスタンスが使用できるユニークな データを発見するために、あまりにも多くの時間を費やしました。このデータは、リカバリ/リスタート時に開いたすべてのファイルがマッピング可能なように、繰り返し使用できるものでなければなりませんでした。私は、同じccy+per chartのEAインスタンスが、ユニークなファイル名を「何らかの方法で」オープンし、再起動時に魔法のように 再オープンできるようにしたかったのですが...。


ウィンドウズ・ハンドルのデータは、その「ファクターX」になり得るか?

 
fbj:

確かにBB、Vip Datumsです。私は、複数のEAが使用できるユニークな データを発見するために、あまりにも多くの時間を費やしました。このデータは、リカバリー/リスタート時に開いたすべてのファイルがマッピング可能であるような再現性がなければなりません。私は、同じccy+per chartのEAインスタンスが「何らかの方法で」ユニークなファイル名を開き、再起動時に魔法のように 再オープンする可能性を許容したかったのですが...。

MT4またはユーザーが各EAにIDを割り当てない限り、これが可能だとは思えません。もっと正確に言うと、ユニークなIDを生成して、EAの.chrファイルを修正してEAのexternパラメータの 一部としてIDを保存するような、非常に厄介なことを伴わないものを見ることができません。


そして、一般的な娯楽として、以下は本当に何の議論も進展させませんが、djb2ハッシュへの入力をユニークであることが保証された値で置き換えます(DLLコールを必要とする代償として)。GUIDのようなものに対してdjb2がどの程度優れているかは知らないが、1,000,000個のIDを生成してみたところ、衝突は起きなかった。しかし、それでも再起動の問題は解決しません。


#import "ole32.dll"
   int CoCreateGuid(int & Bytes[]);
#import

int GenerateMagicNumber()
{
   // Generate a 16-byte GUID
   int Bytes[4];
   CoCreateGuid( Bytes);
   
   // Hash the GUID using djb2
   int iHash = 5381;
   for (int i = 0; i < 4; i++) {
      //original C code: hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
      iHash = (( iHash << 5) + iHash) + Bytes[ i];
   }
   return (MathAbs( iHash));
}
 
fbj wrote>>

ウィンドウ・ハンドルのデータは、その「要因X」かもしれない?

もし、部分的に注文を閉じていない のであれば、注文コメントを使って、ペアや時間枠の情報を保存することができるのでは...?

そうすれば、EAが再起動したときに、前の注文があるかどうか、そして、そのために使うべきマジックナンバーを知ることができるのでは?

NB

コメントを 25 以下にして、LEFT(OrderComments(), 24) をチェックする。そうしないと、[sl] や [tp] が影響する可能性がある。

<すべての履歴>は、アカウント履歴タブで利用可能なままであると仮定しています

FWIW

-BB-