기고글 토론 "ORDER_MAGIC을 사용하여 단일 상품에서 여러 Expert Advisors와의 거래"

 

새로운 기고글 ORDER_MAGIC을 사용하여 단일 상품에서 여러 Expert Advisors와의 거래 가 게재되었습니다:

이 글에서는 매직 식별을 사용한 정보 코딩 문제와 다양한 Expert Advisors의 자동 거래의 분할, 조립 및 동기화에 대해 설명합니다. 이 글은 Expert Advisors와 다양한 전략의 복잡한 동기화 시스템을 구현하는 데 유용할 수 있는 가상 포지션 문제를 다루기 때문에 초보자는 물론 숙련된 거래자에게도 흥미로울 것입니다.

이제이 EA를 실행하려고 하지만 한 기기의 다른 시간 프레임에서 실행합니다 (실험을 위해 임의의 기기를 선택했습니다. EURUSD: o)

그림 2. 서로 다른 시간대에 동일한 도구를 사용하는 두 Expert Advisor의 충돌

그림 2. 서로 다른 시간대에 동일한 도구를 사용하는 두 Expert Advisor의 충돌

두 Expert Advisors가 하나의 상품에서 실행되고 코드가 포지션 공유를 지정하지 않기 때문에, 두 Expert Advisor는 인디케이터의 판독 값에 따라 거래 포지션을 수정하려고 합니다. - 갈등이 생긴다. M1에서 실행되는 Expert Advisor는 Cell의 포지션을 ​​바꾸려고 노력하고 있으며 경쟁자는 이를 막으려고 합니다. 별도의 포지션 계산이 필요하다는 것이 분명합니다.

작성자: Nikolay Demko

 

누가 어떻게 했는지는 모르겠지만, 저는 직접 열거형을 만들 때 ID 번호를 명시적으로 지정하는 것을 선호합니다(필수는 아니지만).

예를 들어 다음과 같이요:

enum Emagic
{
ENUM_DIGITAL_NAME      = 0, // 어드바이저의 숫자 이름
ENUM_CODE_INTERACTION  = 1, // 인터랙션 코드
ENUM_EXPERT_SYMBOL     = 2  // EA가 시작되는 기호
};

MQL4에서 마이그레이션할 때에도 도움이 될 수 있습니다. 예를 들어 주문 작업에 사용하는 열거형은 다음과 같습니다.

//enum_mt4_order_type
enum ENUM_MT4_ORDER_TYPE
//거래 운영 유형
{
OP_BUY  = 0, //구매 
OP_SELL = 1, //Sale 
OP_BUYLIMIT  = 2, // 구매 한도 주문 대기 중 
OP_SELLLIMIT = 3, //보류 주문 매도 제한 
OP_BUYSTOP   = 4, //보류 중인 구매 중지 주문 
OP_SELLSTOP  = 5  //보류 중인 판매 중지 주문 
};

이 접근 방식은 열거형에서 식별자의 위치에 관계없이 해당 코드(숫자 값은 변경되지 않음)....

또한이 접근 방식은 열거 형에 음수 값을 가진 식별자가 포함되어야하는 경우 편리합니다.


추신

저자 덕분에 매우 흥미로운 기사 ...

 
Interesting:

누가 어떻게 했는지는 모르겠지만, 저는 직접 열거형을 만들 때 ID 번호를 명시적으로 지정하는 것을 선호합니다(필수는 아니지만).

예를 들어 다음과 같이요:

MQL4에서 마이그레이션할 때에도 도움이 될 수 있습니다. 예를 들어 주문 작업에 사용하는 열거형은 다음과 같습니다.

이 접근 방식은 열거형에서 식별자의 위치에 관계없이 해당 코드(숫자 값은 변경되지 않음)....

또한이 접근 방식은 열거 형에 음수 값을 가진 식별자가 포함되어야하는 경우 편리합니다.


추신

저자 덕분에 매우 흥미로운 기사 ...


열거 형을 선언 할 때 값이 자동으로 순서대로 할당되기 때문에 저에게는 중요하지 않습니다,

귀하의 변형이 더 명확하다는 데 동의하지만 (특히 열거 형이 길면 3-4 개 이상).

 

마술사에 대한 이러한 접근 방식을 사용하면 사용자에게 동일한 지침을 작성해야하므로 사용자가 어떤 마술사가 점령되고 어떤 마술사가 무료인지 명확하게 알 수 있습니다. 전문가 고문 사용자는 한 명의 개발자뿐만 아니라 전문가 고문을 사용하며이 방법은 모든 전문가 고문 작성자가 사용하는 표준에 포함되지 않을 것입니다. 터미널 개발자가 이 울롱을 여러 변수로 나누어 여러 개의 마법사, 예를 들어 2바이트짜리 마법사 4개를 만들었으면 좋았을 것입니다.

request.magic
request.id1
request.id2
request.id3

또는 최소한 라이브러리로 터미널을 완성하여 어떻게든 표준에 포함될 수 있도록 하세요.

SetMagic(Magic,Id1,Id2,Id3) 
 
Integer:

마술사에 대한 이러한 접근 방식을 사용하면 사용자에게 동일한 지침을 작성해야하므로 사용자가 어떤 마술사가 점령되고 어떤 마술사가 무료인지 명확하게 알 수 있습니다. 전문가 고문 사용자는 한 명의 개발자뿐만 아니라 전문가 고문을 사용하며이 방법은 모든 전문가 고문 작성자가 사용하는 표준에 포함되지 않을 것입니다. 터미널 개발자가 이 울롱을 여러 변수로 나누어 여러 개의 마법사, 예를 들어 2바이트짜리 마법사 4개를 만들었으면 좋았을 것입니다.

또는 최소한 라이브러리로 터미널을 완성하여 어떻게든 표준에 포함될 수 있도록 하세요.

사용자에게 MAGIK 작업에 대한 지침을 작성해야한다는 것은 전혀 사실이 아니며, 그렇다면 MAGIK이 어떻게 형성되는지에 대한 설명을 넘어 가지 않을 것입니다.....

나는 현재 이것이 무역 자동화에 관한 최고의 기사 중 하나라고 생각합니다. 나는 더 말할 것입니다-나는 나 자신이 777777 또는 555555보다 더 심각한 수준에서 MAGIC 코딩의 지지자이며, 심지어 저자가 말하는 것보다 더 자세한 정보를 거기에 넣는 것을 선호 할 수도 있습니다.

그러나 나는 아마도 그 직전에 있었지만 구조를 사용하는 것을 깨닫지 못했습니다 (코딩의 아이디어는 MQL4 이후로 존재 해 왔기 때문에).

또한 거래 작업이 이루어지는 기호에 대한 정보를 MAGIC에 "작성"할 필요가 없다고 생각합니다 (이는이 정보가 이미 다른 곳에 저장되어 있고 주문 순간부터 포지션이 완전히 마감되는 순간까지 변경되지 않기 때문입니다). 또한 MAGIC의 마지막 세 자리 (보안 코드를 사용하지 않는 경우)를 전문가의 마커 (또는 마커, 유전 공학에서는 어떻게되는지 말하지 않겠습니다)에 할당하는 것으로 충분할 것이라고 생각합니다.

이는이 숫자 중 첫 번째 숫자에는 9-10 개의 기본 전문가 클래스를 인코딩하고 나머지 두 숫자에는 사용자 또는 개발자의 관점에서 고유 번호를 인코딩 할 수 있기 때문입니다. 결과적으로 일반적으로 900개에서 1000개의 조합을 얻을 수 있습니다.

저는 또한 전문가 어드바이저가 최소한 트레이더가 설정한 주문을 인식하고 그에 따라 인코딩하는 알고리즘을 선호합니다.

추신

적어도 특정 접근 방식을 사용하면 언뜻보기에 위험하지 않고 (아마도 가능성이있는 것처럼) 여러 EA가 코딩 된 MAGIC을 혼동 할까봐 두려워 할 필요가 없다고 생각합니다. 특히 이러한 모든 전문가 (다른 저자의 경우에도)가 MAGIC을 암호화하는이 방법론을 지원하고 서로의 행동을 고려하는 경우 무의미 해집니다. 이상적으로는 한 명의 전문가 만이이 쌍 또는 그 쌍에서 거래해야합니다.....

 

이 문서에서는 코드 사용의 예를 제시하고 있으며, 모든 숫자가 사용되는 것은 아니며 코딩이 초과되어 있는 것이 분명합니다,

필요한 경우이 9 개의 점유 된 비트조차도 압축 될 수 있습니다.

마술사 (나머지 9 비트)에 대한 식별 외에도 주문시 잔액 상태를 전송할 수도 있습니다.

잔액에 6비트 이상이 소요될 가능성은 거의 없으므로 코딩할 여지는 여전히 남아 있습니다.

 
Urain:

이 문서에서는 코드 사용의 예를 제시하고 있으며, 모든 숫자가 사용되는 것은 아니며 코딩이 초과되어 있는 것이 분명합니다,

필요한 경우이 9 개의 점유 된 비트조차도 압축 될 수 있습니다.

마술사 (나머지 9 비트)에 대한 식별 외에도 주문시 잔액 상태를 전송할 수도 있습니다.

잔액이 6비트를 넘지 않을 가능성이 높으므로 코딩할 여지가 남아 있습니다.

이 모든 것에 1000 또는 10000을 더하고 디코딩하기 전에 빼야하므로 방법이 차지하지 않는 마법의 범위가 보장됩니다.

 
Integer:

이 모든 것에 1000 또는 10000을 추가해야하며 디코딩하기 전에 빼기 전에 마법의 방법에 의해 점유되지 않는 보장 된 범위가 있습니다.

글쎄,이를 수행하는 방법은 기사에서 고통없이 설명합니다 (암호화 범위를 확장하기 위해 약간의 작업이 필요합니다),

나는 어떤 문제가 보이지 않습니다.

추신 유일한 얇은 장소는 균형을 정수로 번역하는 것을 잊지 말아야합니다. 그렇지 않으면 쉼표가 결함을 줄 것입니다. 계정 센트가 100을 곱한 다음 그러한 정밀도가 필요하지 않은 경우 트리밍으로 정수로 번역하는 경우 바인딩에서이를 수행하는 방법을 볼 수 있어야합니다.

 
Urain:

고통없이 수행하는 방법은 기사에 설명되어 있습니다 (암호화 범위를 확장하기 위해 약간의 조정이 필요합니다),

나는 어떤 문제도 보이지 않습니다.

추신 유일한 얇은 곳은 잔액을 정수로 변환하는 것을 잊지 말아야합니다. 그렇지 않으면 쉼표가 결함을 일으킬 수 있으며, 수행하는 방법은 계정이 센트 인 경우 바인딩을보고 그러한 정밀도가 필요하지 않은 경우 100을 곱한 다음 클리핑으로 정수로 변환하는 것입니다.

문제가 없으면 짧고 명확한 지침, 시스템에 의해 인코딩되고 인코딩되지 않은 마법의 비 교차점을 보장하는 방법을 제공하십시오.

 
Integer:

문제가되지 않으면 짧고 명확한 지침, 시스템에 의해 인코딩되고 인코딩되지 않은 마법의 비 교차점을 보장하는 방법을 짧고 명확한 지침을 제공하십시오.

내 대답이 변명처럼 보이지 않도록이 질문은 고려되지 않지만 허용된다는 것을 한 번에 말할 것입니다.

다음은 울롱 18 446 744 073 709 551 615 17 * 10^18의 최대 값이며 모든 자유 필드가 있습니다. 17 000 000 000 000 000 000 000을 입력하고 20과 19를 각각 1과 7로 계산한 후 디코더에 입력하거나 출력할 수 없습니다.

//+------------------------------------------------------------------+
//| 이 함수는 입력 데이터로 조립된 조립식 마법을 반환합니다 ||.
//+------------------------------------------------------------------+
ulong Cmagic::SetMagic_request(int digital_name=0,int code_interaction=0)
  {
   if(digital_name>=1000)Print("어드바이저의 숫자 이름이 잘못 설정되었습니다(1000보다 큼).");
   if(code_interaction>=1000)Print("외국인-외국인 식별 코드가 잘못 설정되었습니다(1000보다 큼).");
   mag.digital_name     =digital_name;
   mag.code_interaction =code_interaction;
   mag.expert_symbol    =symbolexpert();
   mag.magicnumber      =17000000000000000000+// вот эта вставка даст 20 разрядов магику
                         mag.digital_name*(int)pow(1000,2)+
                         mag.code_interaction*(int)pow(1000,1)+
                         mag.expert_symbol;
   return(mag.magicnumber);
  }

그리고 디코더에서.

//+------------------------------------------------------------------+
//| 이 함수는 마법을 세 자리 숫자로 세 부분으로 나눕니다 ||.
//||로 지정한 부분을 반환합니다.
//+------------------------------------------------------------------+
int Cmagic::decodeMagic_result(int category)
  {
   string string_value=(string)mag.magicnumber;
   int rem=(int)MathMod(StringLen(string_value),3);
   if(rem!=0)
     {
      rem=3-rem;
      string srem="0";
      if(rem==2)srem="00";
      string_value=srem+string_value;
     }
   int start_pos=StringLen(string_value)-3*category;
   string value=StringSubstr(string_value,start_pos,3);
   if(StringLen(string_value)!=20)return((int)StringToInteger("0"));//если магика не 20 разрядов значит не кодированный
   return((int)StringToInteger(value));
  }

그게 다야, 하고 싶은 사람은 기회를 찾고 있고하고 싶지 않은 사람은 이유를 찾고 있다는 디미트리를 잊지 마세요, 나는 당신의 힘으로 창문이나 문을 만들 수있는 창을 열었습니다.

그건 그렇고, 저는 이것을 사용합니다.

(int)pow(1000,2)

숫자로 변위하지만 아무도 문자열을 통해 다시 작성하는 것을 금지하지 않으며, 기사에서 두 가지 방법을 모두 보여주고 가능한 경우 유기적으로 적합하게 보여주고 싶었습니다 (따라서 인코딩은 int를 통해 이루어지고 디코딩은 문자열을 통해 이루어집니다).

그리고 일반적으로 나는 가능성을 보여주고 블랙 박스 변환기를 제공하지 않고 싶었습니다 (죽 한 통보다 삽을주는 것이 낫습니다).

추신 여기에 한 가지 인코딩 된 다른 것 (네트워크가 정기적으로 노크 아웃되도록 뇌우가 있음)이 20 자리와 19 자리의 1과 7이 아닌 인코딩 된 수표와 마술 20 자리 숫자가 인코딩을 사용하는 경우 이러한 바로 그 숫자의 존재를 이해하지만 수표가 재생 될 수 있음을 이해합니다.

 

1.기사 작성자에게 감사드립니다.
2.표현식 (int)의 의미와 int에서 취하는 값 DIGITS=(int)-log10(SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP)); if(DIGITS<0)DIGITS=0;
3.테스트 중에 표현식 (int) 및 SYMBOL_VOLUME_STEP이 알 수 없는 식별자 값을 사용하는 이유는 무엇이며 결과 int DIGITS에 어떤 영향을 미칩니까?
4. 인터랙션 코드는 어떻게 작동하나요?
EA가 동일한 기기에서 작동하는 경우, 동일하거나 다른 숫자 이름을 설정하는 것으로 충분할 때 상호 작용 코드가 중요합니까?