자동 매직 넘버 - 페이지 2

 
jjc :

여기서 누락된 것이 있습니다. USDJPY H1과 같은 두 개의 차트를 열고 각각에 EA 인스턴스를 추가하면 둘 다 매직 넘버 9999033을 사용합니다.

예, 그 옵션은 사용해본 적이 없기 때문에 내장되어 있지 않습니다. 두 개의 동일한 차트(내가 볼 수 있음)를 구별할 수 있는 유일한 가능성은 창 핸들에서 해시하는 것입니다...

하지만 그런 다음 다시 시작 및 차트 닫기 에 대한 지속성을 잃게 되므로 결과적으로 고아 주문이 생성되거나 생성될 것입니다.

 
BarrowBoy :

그렇다면 MT 터미널 앱은 <전체>에 대한 단일 hWnd가 있는 '컨테이너'입니까?

네. 상당히 일반적인 MDI 응용 프로그램입니다. 도구 모음, 창 및 MDI 클라이언트 영역과 같은 항목이 포함된 최상위 창이 있습니다. 그런 다음 후자는 각 차트를 포함하고 각 차트는 실제로 두 개의 창으로 구성됩니다. 즉, 내부에 그리기 영역이 있는 컨테이너입니다. 이러한 각 항목에는 고유한 hWnd 핸들이 있습니다. WindowHandle() 함수 는 그리기 영역의 핸들을 반환하므로 GetParent() API 호출을 세 번 사용하면 최상위 MT4 창의 hWnd가 제공됩니다.

 

fwiw, 나는 아래를 사용하고 중복이 없었습니다. 최대 10개의 [모든 유형] 차트에서 동일한 EA.

나는 해시 함수 에 넘겨진 엄청나게 과도한 정크 실제에 대한 대답이 없습니다. 부엌 싱크대를 포함하여 모든 것을 쑤셔 넣었습니다. 즉, 저는 수학을 하는 사람이 아닙니다... 반복되지 않을 때까지 망치질만 하면 됩니다. 심지어 10개의 차트 프로필이 모두 동일한 EA로 터미널 시작 시에도...

분명히, 나는 더 좋고 더 설명할 수 있는 /논리적인 방법을 갖고 싶어 할 것입니다... 그래서 그것을 조각으로 찢기 시작하십시오 :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 :

fwiw, 나는 아래를 사용하고 중복이 없었습니다. 최대 10개의 [모든 유형] 차트에서 동일한 EA.

나는 해시 함수에 넘겨진 엄청나게 과도한 정크 실제에 대한 대답이 없습니다. 부엌 싱크대를 포함하여 모든 것을 쑤셔 넣었습니다. 즉, 저는 수학을 하는 사람이 아닙니다... 반복되지 않을 때까지 망치질만 하면 됩니다. 심지어 10개의 차트 프로필이 모두 동일한 EA로 터미널 시작 시에도...

분명히, 나는 더 좋고 더 설명할 수 있는 /논리적인 방법을 갖고 싶어 할 것입니다... 그래서 그것을 조각으로 찢기 시작하십시오 :O)

좋아요. 특히 좋은 ol' djb2 해시.

 

매우 인상적인 물건 챕스 :)

MDI 컨테이너는 나를 다시 데려갑니다 <한숨>

나는 여전히 IMHO, Magic Numbers는 무작위로 적용하기에는 너무 중요 하다고 말합니다!

나는 CB가 재시작 시 예측 가능한 복구가 강력한 시스템에서 매우 중요한 요소임을 확인할 것이라고 확신합니다.

FWIW

-BB-

 

이 코드를 사용하면 플랫폼이 종료되는 경우 EA가 자체 주문을 인식할 수 있습니다. 전역 변수를 사용하므로 EA가 PC 종료에 "면역"되도록 하려면 전역 변수 대신 파일을 사용 하도록 다시 작성할 수 있습니다. 초기화 시간에 포지션을 열고 다음 막대에서 닫는 예제도 첨부했습니다. 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 >>

좋아요. 특히 좋은 ol' djb2 해시.

감사합니다. 하지만 makeexpertid에서 그렇게 정보가 없는 코딩을 하는 것이 정말 부끄럽습니다...

아직 이르지만 누군가가 결함을 발견할 수 있을 것입니다... 존재해야 합니다.

 
BarrowBoy wrote >>

매우 인상적인 물건 챕스 :)

MDI 컨테이너는 나를 다시 데려갑니다 <한숨>

나는 여전히 IMHO, Magic Numbers는 무작위로 적용하기에는 너무 중요하다고 말합니다!

나는 CB가 재시작 시 예측 가능한 복구가 강력한 시스템에서 매우 중요한 요소임을 확인할 것이라고 확신합니다.


FWIW

-BB-

나는 여전히 IMHO, Magic Numbers는 무작위로 적용하기에는 너무 중요하다고 말합니다!

확실히 BB, vip 데이텀. EA의 여러 인스턴스에서 사용할 수 있는 고유한 데이터를 찾는 데 너무 많은 시간을 할애했습니다. 이 데이터는 열려 있는 모든 파일을 복구/재시작 시 매핑할 수 있도록 반복 가능해야 했습니다. 동일한 ccy+per chart EA 인스턴스가 고유한 파일 이름을 '어떻게' 열고 다시 시작할 때 마술처럼 다시 열 수 있도록 하고 싶었습니다...


창 핸들 데이터는 '요소 X'가 될 수 있습니까?

 
fbj :

확실히 BB, vip 데이텀. EA의 여러 인스턴스에서 사용할 수 있는 고유한 데이터를 찾는 데 너무 많은 시간을 할애했습니다. 이 데이터는 열려 있는 모든 파일을 복구/재시작 시 매핑할 수 있도록 반복 가능해야 했습니다. 동일한 ccy+per chart EA 인스턴스가 고유한 파일 이름을 '어떻게' 열고 다시 시작할 때 마술처럼 다시 열 수 있도록 하고 싶었습니다...

MT4나 사용자가 각 EA에 ID를 할당하지 않고는 이것이 어떻게 가능한지 알 수 없습니다. 또는 더 정확하게는 고유 ID를 생성한 다음 EA의 extern 매개변수 의 일부로 ID를 저장하도록 EA의 .chr 파일을 수정하는 것과 같이 매우 불쾌한 일을 포함하지 않는 것을 볼 수 없습니다.


그리고 일반적인 오락을 위해 다음은 어떤 식으로든 토론을 실제로 진행시키지는 않지만 djb2 해시에 대한 입력을 고유하게 보장되는 값으로 대체합니다(DLL 호출을 요구하는 비용으로). 나는 djb2가 GUID와 같은 것에 대해 얼마나 좋은 의미인지 모르지만 충돌 없이 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는 다시 시작할 때 사전 주문이 있는지, 따라서 어떤 매직 넘버를 사용해야 하는지 알아낼 수 있습니까?

주의

주석을 < 25로 유지하고 LEFT(OrderComments(), 24)를 확인하지 않으면 [sl] 또는 [tp] 항목이 영향을 미칠 수 있습니다.

계정 기록 탭에서 <모든 기록>을 사용할 수 있다고 가정합니다!

FWIW

-BB-