자동 매직 넘버 - 페이지 4

 
cloudbreaker :

(매우 간결하게) 문서화하는 것이 유용할 것이라고 생각했습니다.

1. 매직넘버 구현 결정 기준

2. 자동 매직넘버 생성 사용 여부 판단 기준

3. 퍼시스턴스 계층 구현 결정 기준

4. 지속성을 위한 전역 대 파일 액세스를 결정하는 기준

간략하고 지극히 개인적인 답변...


(2) 사용자가 매직 넘버를 제어하여 다양한 전략의 결과를 그룹화하는 방법으로 사용할 수 있기를 원하는지 여부를 포함하여 여러 요인에 따라 달라집니다.

(3) 가능하면 피하고 싶지만 거의 할 수 없습니다( '외부 변수 및 시간 프레임 변경?' 참조). MT4가 EA의 상태를 유지하고 복구하는 데 도움이 된다면 좋을 것입니다. 하지만 그렇지 않습니다.

(4) 상당히 강한 개인적 선호로 이어집니다: 저는 글로벌을 좋아하지 않습니다. 사용자가 삭제할 수 있습니다. 저장은 숫자로 제한됩니다. 그리고 gvariables.dat의 형식은 불분명합니다. 필요한 경우 최후의 수단으로 텍스트 편집기를 사용하여 수정할 수 있는 파일을 훨씬 선호합니다.


-잠시 휴식을 취하기 전에 8개의 게시물만 남았습니다.

당신이 마법의 숫자를 쳤다는 것을 알았습니다. 적어도 당신이 있는 곳은 따뜻할 것입니다...

 

나는 이 아이디어를 계속해서 연구해왔고 마침내 내가 원하는 것을 하게 되었습니다. 다음은 기호의 ASCII 코드를 가져와 시간 프레임과 사용자 지정 코드에 추가하여 시간 프레임, 기호 및 EA에 고유한 매직 번호를 생성하는 매직 넘버 생성기입니다. EA가 자체 이름을 읽는 방법을 알고 있다면 사용자 지정 코드 대신 ASCII를 사용하겠습니다. 그 약점으로 인해 위의 기준에 부합한다고 생각합니다. 시스템 재부팅 시 이전에 선택한 것과 동일한 번호를 선택하기 때문에 시스템 충돌이 있는 경우에는 괜찮을 것입니다. 내가 볼 수있는 약점은 동일한 기간 및 기호에서 동일한 EA의 인스턴스를 두 개 이상 거래하는 경우 중복 마법 번호를 선택한다는 것입니다.

내가 가진 것은 다음과 같습니다.

문자열 GetSymbol=심볼();
int MNSymbol, MNSymbolCalc, MagicNumber;
for(int a=0;a<6;a++)//Symbol()을 ASCII 문자열로 변환하고 각 문자를 MNSymbol에 추가합니다.
{
MNSymbolCalc=StringGetChar(GetSymbol, a);
MNSymbolCalc=((MNSymbolCalc-64)*(MathPow(10,(a))));//빼기 64 b/c ASCII 문자는 65에서 시작하고 결과에 a-th 거듭제곱을 곱하여 깔끔함을 나타냅니다(불필요하지만).
MNSymbol = MNSymbol+MNSymbolCalc;
}
int MNPeriod=마침표();

int MNEACode=100000;//두 가지 다른 유형의 EA가 동일한 매직 번호를 선택하는 것을 방지하기 위해 각 EA에 대해 이 번호를 다르게 만듭니다.
MagicNumber=MNSymbol+MNPeriod+MNEACode;

 

JT, 네... 중복 '문제'는 악몽의 물건입니다 ;)


당신과 내가 많은 사람들이 생각하는 것처럼 고유성 문제는 언제라도 공격을 받기는 하지만 결코 옳지 않은 것처럼 보이는 끊임없이 되풀이되는 주제입니다!

이 스레드의 앞부분에 게시된 내 코드는 아래로 대체되었습니다.

*** 내장 호출을 통해 사용할 수 있는 EA 이름 문자열을 확인하세요.

다중 ccy를 만들기 위한 노력으로 사용되는 로컬 기능 이 있습니다. 즉, 항상 동일한 함수 헤더 코드를 코딩하여 빈 실제 값을 확인하는 데 지쳤습니다. ccy,per

따라서 _Symbol() 및 _Period()를 사용합니다. 속도/크기 고려사항 imho, MT4 인터프리터에서도 걱정할 가치가 없습니다...

어쨌든 이것은 생각할 거리를 줄 수 있습니다 ...


아래 [및 기능에서 문서화]에 대한 내 추론은 다음과 같습니다.

이것은 EA가 CCY,PER에서 중지하면 나중에 동일한 CCY,PER에 대해 다시 실행할 때 확인하는 편리한 방법입니다.

동일한 giExpertId(일명 Magic#)를 생성합니다. 풀에서 미결 거래 관리를 재개할 수 있음을 의미합니다...

다른 명명된 EA는 값 중복에 대한 두려움 없이 동일한 차트 환경에서 실행할 수 있습니다.

따라서 OrderPools에는 EA 고유의 매직#이 있는 티켓이 있으므로 EA당 티켓만 매핑할 수 있습니다.


동일한 ccy,per에 대한 >1개의 '동일한 이름' EA에 대한 귀하의 의견은 실제로 문제입니다. 나는 마침내 HEY! 현실을 직시하라... 내가 이런 실수를 하면 내가 너무 생각이 없는 것에 대해 뒷걸음질을 칠 자격이 있어, lol

결국 이 스레드에서 볼 수 있듯이 각각의 강점과 약점이 있는 수많은 아이디어/방법이 있습니다.

모든 것은 EA가 실행될 때마다 [최소한] 하나의 고유한 데이터 를 얻는 것으로 귀결되며 [저에게] 커널 문제입니다.

재시작으로 이어지는 EA/CT 충돌에 대해 별로 생각해본 적이 없으며 웜의 캔은 중단된 부분을 다시 시작하는 것과 관련이 있습니다. EA가 자동 생성하는 한 R/T 차트 환경에 고유한 데이터가 있는 EAid/magic#입니다. 항상 같은 번호를 생성합니다 ...

음, 재미있게 보내십시오!


 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를 실행해야 하는 경우에는 확실히 방탄이 아닙니다. 그래서 그렇습니다... magic#을 수동으로 설정하는 것이 궁극적인 확실한 방법입니다. 의심의 여지가 없습니다!


나에게 줄은 항상 뒤쪽에서 고통스러웠다. 그러나 대부분의 모든 것은 하위 수준 도구의 기능을 각각 활용하는 도구 세트를 점진적으로 구축함으로써 가능합니다.

또한, irusoh1 이 '이것이 바로 그것이다'라고 말한/ 상기시켜준 것을 기억합니다. 그래서 그것으로 라이브를 합니다... 글쎄, 저는 항상 그의 게시물 내용의 첫 번째 단락을 기억하고 다음을 지적할 때마다 *항상* 마음속에 있습니다. 느슨한 의지가 살아있는 MT :))


MQL4 온라인/오프라인은 기본 데이터 유형에 대해 설명합니다. 둘 다의 문자열 링크는 문자열 상수 로 이동하고 우리 모두는 해당 문서 페이지가 말하는 내용을 알고 있습니다... 즉, 255바이트입니다.

나는 당신이 말하는 것을 완전히 이해하지만 29373 스레드는 MQL4 런타임 문자열 처리와 마찬가지로 결정적이지 않고 jjc 이며 의심의 여지없이 많은 다른 사람들이 경험했습니다.

더 긴 문자열을 지원하는 문서가 있는 경우 8byte 구조체 형식의 전체 활용을 지원하는 문서를 찾을 수 없습니다.

어쨌든, 나는 과거에 문자열을 사용하여 해결할 수 없는 문제가 있었기 때문에 필요한 경우 문서에서 말하는 것을 고수하고 해결하는 것을 선호합니다.

 
fbj :

MQL4 온라인/오프라인은 기본 데이터 유형에 대해 설명합니다. 둘 다의 문자열 링크는 문자열 상수 로 이동하고 우리 모두는 해당 문서 페이지가 말하는 내용을 알고 있습니다... 즉, 255바이트입니다.

나는 당신이 말하는 것을 완전히 이해하지만 29373 스레드는 MQL4 런타임 문자열 처리와 마찬가지로 결정적이지 않고 jjc 이며 의심의 여지없이 많은 다른 사람들이 경험했습니다.

더 긴 문자열을 지원하는 문서가 있는 경우 8byte 구조체 형식의 전체 활용을 지원하는 문서를 찾을 수 없습니다.

어쨌든, 나는 과거에 문자열을 사용하여 해결할 수 없는 문제가 있었기 때문에 필요한 경우 문서에서 말하는 것을 고수하고 해결하는 것을 선호합니다.

최대 255개를 고수하는 것은 분명히 안전한 솔루션이지만 이 제한을 무시하는 코드가 상당히 많고 문제가 발생한 적이 없습니다. 그러나 다시 이 코드는 대부분 중요하지 않습니다.

문서가 이 주제에 대해 약간 불분명하다는 것을 알고 있지만 (Google 번역을 사용하여) 러시아 포럼을 검색하려고 하면 중재자 중 한 명이 문자열 변수가 255바이트 이상을 지원한다는 공식 댓글을 읽은 기억이 있지만 할 수 없습니다. 이제 찾은 것 같군요... 아 글쎄요, "이거다"라고 생각하고 우리는 그걸로 살아야 해요 :)

 
fbj :

더 긴 문자열을 지원하는 문서가 있는 경우 8byte 구조체 형식의 전체 활용을 지원하는 문서를 찾을 수 없습니다.

어쨌든, 나는 과거에 문자열을 사용하여 해결할 수 없는 문제가 있었기 때문에 필요한 경우 문서에서 말하는 것을 고수하고 해결하는 것을 선호합니다.

" 문자열 상수의 길이는 0에서 255 자 사이입니다. 문자열 상수가 더 길면 오른쪽에 있는 불필요한 문자는 거부되고 컴파일러는 이에 따라 경고합니다.

내부 표현은 8바이트 구조입니다. 구조의 첫 번째 요소는 행에 대해 분산된 버퍼의 크기를 포함하는 긴 정수입니다. 구조의 두 번째 요소는 행을 포함하는 버퍼의 32차 주소입니다. "

MetaEditor 사전에서 인용 데이터 유형 - 문자열 상수

매력적인 물건들...

 

이 스레드가 오래되었다는 것을 알고 있지만 모든 사람이 "마법 번호" 또는 원하는 이름을 얻을 수 있는 고유한 방법이 있다는 것을 알았습니다. 나는 또한 누군가가 거기에서 EA가 자체 이름을 읽을 수 있기를 바라는 것을 보았습니다...글쎄 이것이 내가 내 EA의 이름을 얻는 데 사용하는 것입니다

이것을 EA 상단에 놓으십시오.

#define EAName "여기에 EA 이름을 입력하세요"

미결 주문을 확인할 때 다음을 수행하십시오.

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

거래가 이루어지면 다음과 같은 의견에 대해 EAName을 배치하도록 거래를 가지고 있는지 확인하십시오.

티켓 = OrderSend(Symbol(), OP_BUY, lot, Ask, Slippage, 0, 0, EAName, MagicNumber, 0, Blue);

그런 다음 같은 쌍에서 동시에 다른 TF에서 EA를 실행하려는 경우와 같은 마법의 숫자를 원할 경우..........다음을 사용하십시오.

정수 MagicNumber = 마침표();