매직넘버 생성 - 페이지 3

 
//|                                                      This_EA.mq4 |
//|                      Copyright © 2010, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+

#define This_EA   101
#define That_EA   102
#define Other_EA 103 // put this list of ea names to each of your ea's header, or...
                     // .. alternatively you can use a number suffix to your ea's file name 
                     // so it can be identified with --> StringSubstr(WindowExpertName(),x,y);
double This_EA_qty;
string magic_prefix;

int init()
  {

   if ( GlobalVariableGet (This_EA_qty) >= 0 .0 ){
             GlobalVariableSet ( "This_EA_qty" , This_EA_qty + 1 );
   }
   magic_prefix = StringConcatenate (This_EA, DoubleToStr(This_EA_qty, 0 ));

   return ( 0 );
  }

int deinit()
  {

      GlobalVariableSet ( "This_EA_qty" , This_EA_qty - 1 );
   
   return ( 0 );
  }

int start()
  {
       double lots, SL, TP; int slip, time_stamp ;
       bool BuyCondition;
   
       if ( BuyCondition == true )
      {
         time_stamp  = TimeCurrent (); 
         string magic_name = StringConcatenate (magic_prefix, time_stamp );
         int magic = StrToInteger(magic_name);
         
                                      // Integers range from -2147483648 to 2147483647
                                       // the resulting magic integer would most probably exceed that 
                                       // so we cut the number returned with TimeCurrent() short with 
                                      // MathMod(time_stamp,x) x being years, months not necessary for 
                                       // magic unique-ness. I don't include this calculation, 
                                      // since I'm short in time for testing it...
      
      
         OrderSend ( Symbol (), 0 , lots, Ask, slip, SL, TP, NULL , magic, 0 , CLR_NONE );
      }
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
생각보다 시간이 좀 걸리네요...
편집: GVget 조건 != -1.0 ~ >= 0.0; 편집하다
 
cameofx :
[...] 생각보다 시간이 좀 걸리네요...

이것은 내가 이미 언급한 이전 주제( https://www.mql5.com/en/forum/120034 )의 재해시(말장난에 대한 사과)가 되고 있습니다. 전역 변수와 관련된 모든 것은 백업 및 재해 복구와 관련된 문제를 발생시킵니다. 거래를 서둘러 새 서버로 옮겨야 하는 경우 gvariables.dat의 최근 백업을 사용할 수 있어야 하거나 사용자가 전역 변수를 수동으로 다시 생성할 수 있는 위치에 있어야 합니다.

귀하의 코드를 자세히 연구하지는 않았지만 EA 사본이 여러 개 있고 MT4가 다시 시작되면 어떻게 되는지 잘 모르겠습니다. 코드는 EA가 원래 수동으로 로드된 것과 동일한 순서로 자동으로 다시 로드될 것이라고 가정할 수 있는 것처럼 보입니다. 다시 말해, EA의 여러 복사본은 다시 시작할 때마다 This_EA_qty 값이 다를 수 있으며 MT4 목록에서 과거 주문을 올바르게 식별하는 방법을 알 수 없습니다. 그러나 나는 이것에 대해 틀릴 수 있습니다.

 
cameofx :
생각보다 시간이 좀 걸리네요...
편집 : GVget 조건 != -1.0 ~ >= 0.0
 // TimeCurrent() in seconds since 1970 would most probably exceed that 

TimeCurrent()는 32비트 정수를 반환합니다. 데이터 시간 유형은 int 유형의 별칭이고 int도 32비트 정수입니다.


귀하의 코드에서 내가 이해할 수 없는 또 다른 것은 열린 거래마다 다른 MN을 사용하는 이유입니다. 이것은 MN이 의미하는 것과 반대입니다. MN의 개념은 단순히 MN을 보고 특정 EA의 모든 거래를 식별할 수 있다는 것입니다. MN의 임의 부분에 대한 이유는 무엇입니까? 이 EA의 모든 열린 거래를 닫거나 이 EA의 모든 중지를 추적하는 EA의 코드는 어떻게 생겼습니까?
 
내가 올바르게 이해한다면 실수로 동일한 ID를 가진 2명의 다른 전문가에 대한 귀하의 솔루션은 모든 전문가 ID를 각 전문가의 헤더에 넣는 것입니다. 그것은 엉덩이에 일종의 고통입니다 ... 당신이 포함 파일에 그 부분을 넣더라도 당신은 여전히 당신이 만드는 각각의 새로운 전문가에 대해 모든 전문가를 다시 컴파일해야합니다.

지속성의 문제는 여전히 존재합니다. 터미널을 다시 시작한 후 또는 완전히 다른 터미널로 전환한 후 이것이 어떻게 제대로 작동하는지 모르겠습니다...
 
jjc :

이것은 내가 이미 언급한 이전 주제( https://www.mql5.com/en/forum/120034 )의 재해시(말장난에 대한 사과)가 되고 있습니다. 전역 변수와 관련된 모든 것은 백업 및 재해 복구와 관련된 문제를 발생시킵니다. 거래를 서둘러 새 서버로 옮겨야 하는 경우 gvariables.dat의 최근 백업을 사용할 수 있어야 하거나 사용자가 전역 변수를 수동으로 다시 생성할 수 있는 위치에 있어야 합니다.

귀하의 코드를 자세히 연구하지는 않았지만 EA 사본이 여러 개 있고 MT4가 다시 시작되면 어떻게 되는지 잘 모르겠습니다. 코드는 EA가 원래 수동으로 로드된 것과 동일한 순서로 자동으로 다시 로드될 것이라고 가정할 수 있는 것처럼 보입니다. 다시 말해, EA의 여러 복사본은 다시 시작할 때마다 This_EA_qty 값이 다를 수 있으며 MT4 목록에서 과거 주문을 올바르게 식별하는 방법을 알 수 없습니다. 그러나 나는 이것에 대해 틀릴 수 있습니다.

이것들은 내가 기대하는 피드백의 종류입니다... 감사합니다 gordon, 7bit & jjc..

귀하의 회신에는 숙고가 필요하지만 신속하게 회신하려면 :

- This_EA 전문가가 이미 다른 차트에 한 번 첨부된 경우 magic_number는 다음 값을 갖습니다. 101-1-time_stamp(명확성을 위해 대시)

- 포함된 정보는 101 - 전문가 ID입니다. 1 - 현재 운영 중인 This_EA 수량 time_stamp - OrderSend 시간

- 그런 다음 StringSubStr을 사용하여 스캔하고 1개의 다른 This_EA가 첨부된 동안 특정 주문이 This_EA에 의해 열렸음을 알 수 있습니다.

 
7bit :

TimeCurrent()는 32비트 정수를 반환합니다. 데이터 시간 유형은 int 유형의 별칭이고 int도 32비트 정수입니다.


귀하의 코드에서 내가 이해할 수 없는 또 다른 것은 열린 거래마다 다른 MN을 사용하는 이유입니다. 이것은 MN이 의미하는 것과 반대입니다. MN의 개념은 단순히 MN을 보고 특정 EA의 모든 거래를 식별할 수 있다는 것입니다. MN의 임의 부분에 대한 이유는 무엇입니까? 이 EA의 모든 미결 거래를 마감하거나 이 EA의 모든 중지를 추적하는 EA의 코드는 어떻게 생겼습니까?

죄송합니다. 내가 의미하는 것은 결과로 발생하는 magic_name 이 해당 할당을 초과한다는 것입니다. 그에 따라 코드의 주석을 이동하겠습니다.

우리의 인식을 균등화하기 위해. 나는 이 '자동화된' magic_number에 대해 이 요구사항을 제안할 것입니다. MN에는 다음이 포함됩니다.

- 어떤 EA(MN이 언급한 이 특정 주문)가 열려 있었는지 확인할 수 있습니다.

- 이 기술을 포함하는 EA - 다수(1개 이상)에 부착된 경우 해당 EA가 1초 범위 밖에서 동시에 주문을 여는 경우 동일한 매직 번호를 생성하지 않습니다.

- 따라서 주문 처리에서 충돌하지 않지만 동시에 MN의 출처는 여전히 추적할 수 있습니다.

- 내 목록이 완전하지 않은 경우 추가하십시오...

 
cameofx :
- 포함된 정보는 101 - 전문가 ID입니다. 1 - 현재 운영 중인 This_EA 수량 time_stamp - OrderSend 시간

- 그런 다음 StringSubStr을 사용하여 스캔하고 1개의 다른 This_EA가 첨부된 동안 특정 주문이 This_EA에 의해 열렸음을 알 수 있습니다.

그러나 MN의 시간 부분은 무엇을 위한 것입니까? EA 번호만 사용하지 않는 이유는 무엇입니까? 그리고 substr을 사용하지 않습니까? substr을 사용하려면 int를 문자열로 변환해야 하며, 그런 다음 일부 문자열 작업과 문자열 비교, MN의 시간 부분이 필요하지 않기 때문에 버려집니다. 정수를 사용한 문자열 연산은 일반적으로 아마추어처럼 보이는 경향이 있습니다. 대부분의 경우 정보를 32비트 워드의 다른 비트로 인코딩하고 비트 연산을 사용하여 훨씬 빠르고 우아하게 조작하거나 검사할 수 있기 때문입니다.

mn에 대해 (EA-instance-unique) int 값을 사용하고 정수 비교를 사용하여 정수 또는 특정 비트를 비교하지 않는 이유는 무엇입니까?

예를 들어 처음 28비트를 ID로, 마지막 4비트를 0..15의 숫자로 지정하여 다양한 유형의 거래를 식별합니다(예 : 초기, 레벨1, 레벨2 및 헤지 등 3가지 다른 유형의 주문 을 열 수 있는 경우)

ID = hash & 0xFFFFFFF0    // this has the 4 low bits always zero


// generate the mn for level 1 trades
MN = (ID + 1 );
OrderSend (..., MN, "level 1" );


// generate the mn for hedge trades
MN = (ID + 15 );
OrderSend (..., MN, "hedge the whole mess" );


// this strategy may not make any sense, only to illustrate the code:
// close the hedge trades and trail the stops of all levels
for (...){
   if (OrderMagicNumber() & 0xFFFFFFF0 == ID){   // this trade belongs to us
       if (OrderMagicNumber() & 0x0000000F == 15 ){ // this is a hedge trade
         OrderClose(...)
      } else { // this is one of the other levels
         Trail(OrderTicket());
      }
   }
}

// or even easier:
MN = (ID + 15 ); // all our hedge trades have this MN
for (...){
   if (OrderMagicNumber() == MN){
      OrderClose(...)
   }
}
 
gordon :
내가 올바르게 이해한다면 실수로 동일한 ID를 가진 2명의 다른 전문가에 대한 귀하의 솔루션은 모든 전문가 ID를 각 전문가의 헤더에 넣는 것입니다. 그것은 엉덩이에 일종의 고통입니다 ... 당신이 포함 파일에 그 부분을 넣더라도 당신은 여전히 당신이 만드는 각각의 새로운 전문가에 대해 모든 전문가를 다시 컴파일해야합니다.

지속성의 문제는 여전히 존재합니다. 터미널을 다시 시작한 후 또는 완전히 다른 터미널로 전환한 후 이것이 어떻게 제대로 작동하는지 모르겠습니다...

아니오, 그렇지 않습니다 :) WindowExpertName()에 관한 코드의 주석을 읽으십시오.

전문가에서 호출하면 ".mq4" 또는 ".ex4" 없이 전문가/스크립트/지시자 파일 이름을 검색하므로 그에 따라 이름을 EA로 지정하기만 하면 됩니다.

추신 : 스팸성 답변 죄송합니다 :)

 
7bit :

그러나 MN의 시간 부분은 무엇을 위한 것입니까? EA 번호만 사용하지 않는 이유는 무엇입니까? 그리고 substr을 사용하지 않습니까? substr을 사용하려면 int를 문자열로 변환해야 하며, 그런 다음 일부 문자열 작업과 문자열 비교, MN의 시간 부분이 필요하지 않기 때문에 버려집니다. 정수를 사용한 문자열 연산은 일반적으로 아마추어처럼 보이는 경향이 있습니다. 대부분의 경우 정보를 32비트 워드의 다른 비트로 인코딩하고 비트 연산을 사용하여 훨씬 빠르고 우아하게 조작하거나 검사할 수 있기 때문입니다.

mn에 대해 (EA-instance-unique) int 값을 사용하고 정수 비교를 사용하여 정수 또는 특정 비트를 비교하지 않는 이유는 무엇입니까?

예를 들어 처음 28비트를 ID로, 마지막 4비트를 0..15 사이의 숫자로 지정하여 다양한 유형의 거래를 식별합니다(예: 3가지 다른 유형의 주문을 열 수 있는 경우: 초기, 레벨1, 레벨2 및 헤지)


흠... EA에서 개설한 각 주문에 대한 MN이 다른 차트에서 동일한 EA로 동시에 열리는 다른 주문과 관련하여 고유 해야 한다고 생각했기 때문에 시간 부분을 사용합니다.

전제는 다음과 같습니다. EA가 동일한 매직 넘버로 동시에 두 개(더) 주문을 연 경우. 그들은 동일한 MN을 가질 수 없습니다. 그렇지 않으면 주문 처리에서 충돌할 수 있습니다.

주문 식별... 아마도 이것을 OrderTicket 가져오기(또는 아님?)와 실수로 혼동한 것 같습니다.

- MN에 전략을 통합하는 것은 자연스럽게 다음 단계가 될 것입니다.

- 나는 당신의 기술이 광년에 의해 나를 능가하는 것을 봅니다 :)). 나는 아직 연산을 최적화할 수 있는 능력이 없기 때문에 이것을 게시했습니다. 이제 비트 연산으로 확인 하는 것이 더 빠를 것이라는 것을 압니다.

감사합니다. 나중에 방법 설명을 요청해야 할 수도 있습니다 :)))

 
cameofx :

흠... EA에서 개설한 각 주문에 대한 MN이 다른 주문과 관련하여 고유 해야 한다고 생각했기 때문에 시간 부분을 사용합니다.

아니요, 그들은 당신이 원하는 무엇이든 될 수 있습니다. 댓글처럼. 일종의 숫자 주석으로 볼 수 있습니다. 일반 MT4 사용자 인터페이스로 열린 모든 수동 거래는 매직 넘버 0을 갖기 때문에 예를 들어 모든 EA 거래를 건드리지 않고 모든 주문을 반복하고 모든 수동 거래 및 주문을 마감/삭제할 수 있습니다.

내 모든 EA는 고유한 고유 번호를 생성합니다(EA 이름 + 기호 + 기간). 그래서 이 숫자를 생성하기 위해 훌륭하고 쉬운 해시 함수 를 찾는 데 많은 노력을 기울였습니다. 해시가 너무 좋아서 하위 번호를 위한 공간을 만들기 위해 이 해시의 마지막 몇 비트를 쉽게 잘라낼 수 있으며(필요한 경우지만 거의 필요하지 않음) 충돌에 대해 여전히 매우 안전합니다.

그러나 대부분의 EA는 해시를 직접 사용하고 하위 번호 지정이 없습니다. 거래 유형이 하나뿐이고 모든 거래를 동일하게 취급하기 때문입니다.

하나의 특정 주문만 고유하게 식별하기 위해 항상 티켓 번호가 있습니다.