mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 201

 
매크로를 호출할 때 매개변수를 지정할 수 없습니다(건너뛰기). 때로는 매크로가 지정되지 않은 매개변수와 함께 작동할 가능성을 구체적으로 제공하고 싶을 때가 있습니다.


이러한 경우 몇 가지 보조 매크로를 제공합니다.

1. 때때로 매개변수가 설정되었는지 여부를 매크로 내부에서 확인하려는 경우가 있습니다. IS_PARAMETER_SET(p)는 p가 주어지면 true를 반환하는 표현식을 지정합니다(문자열 변수 == NULL인 경우에도).

주의: 표현식은 컴파일 단계에서 전처리 후 평가됩니다!!!, 즉 #ifdef IS_PARAMETER_SET(p) #else와 같은 것을 구현하는 데 사용할 수 없습니다. (이것은 아래의 다른 매크로에도 적용됩니다)

2. 매개변수가 설정되지 않은 경우 컴파일 오류가 발생 하지 않도록 매개변수 값을 문자열로 명시적으로 변환해야 하는 경우 __EVAL_STR(p)을 사용할 수 있습니다. p가 지정되지 않거나 NULL 리터럴로 명시적으로 지정되면 ""를 반환합니다. 배열, 구조 및 클래스에는 적용되지 않습니다.

3. 매개변수를 숫자로 명시적으로 변환 - __EVAL_NON_STR(p). p가 주어지지 않으면 0을 반환합니다. p가 문자열이면 잘못 작동합니다!

코드 및 사용 예:

 //Expression returns true if macro's parameter is specified.
#define IS_PARAMETER_SET(p) ( "" != #p || __hlp_macro_func(p))
bool __hlp_macro_func( const string p = NULL ) { return "" == p;}
template < typename T> bool __hlp_macro_func(T p)    { return true ;}
template < typename T> bool __hlp_macro_func(T& p)   { return true ;}
template < typename T> bool __hlp_macro_func(T& p[]) { return true ;}


//Expression returns parameter p; if parameter is not specified returns NULL; if p is string returns p
//Error for arrays and objects
#define __EVAL(p) ( "" == #p?NULL:p+NULL)


//Explicit conversion to string. If parameter is not specified or is constant NULL returns ""
//Error for arrays and objects
#define __EVAL_STR(p) ( "" == #p || "NULL" == #p? "" :( string )(p+ NULL ))


//Explicit conversion to number. If parameter is not specified returns 0. Works incorrect if p is string!
//Error for arrays and objects
#define __EVAL_NON_STR(p) ( "" == #p? 0 : p+ 0 )


struct S1
  {   int                a; };
class C1
  { int                a; };

void OnStart ()
  {
//---
   Print (IS_PARAMETER_SET());                 //false
   Print (IS_PARAMETER_SET( "" ));               //true
   Print (IS_PARAMETER_SET( "test" ));           //true
   Print (IS_PARAMETER_SET( NULL ));             //true
   Print (IS_PARAMETER_SET( 0 ));               //true
   Print (IS_PARAMETER_SET( 1 ));               //true
   string str;
   Print (IS_PARAMETER_SET(str));             //true

   int arr[ 1 ];
   Print (IS_PARAMETER_SET(arr));             //true
   S1 _struct;
   Print (IS_PARAMETER_SET(_struct));         //true
   C1 _class;
   Print (IS_PARAMETER_SET(_class));           //true

#define   MACRO1_(a,b)  (IS_PARAMETER_SET(b)?a:-a)
   Print (MACRO1_( 1 , 0 ));                     //1
   Print (MACRO1_( 1 ,));                       //-1

#define   MACRO2_(a,b,c)   Print (a, " = " ,b + c)
#define   MACRO3_(a,b,c)   Print (__EVAL_STR(a), " = " ,__EVAL_NON_STR(b) + __EVAL_NON_STR(c))

 //MACRO2_(, 2,);                            // ',' - syntax error, parameter missed
   MACRO3_(, 2 ,);                             // = 2
   MACRO3_( "a" , 2 , 3 );                       // a = 5
  }


 
fxsaber :

RannForex-Server 데모 계정에 다음 코드가 있으면 이 Expert Advisor를 실행하면 이 상황을 즉시 재현할 수 있습니다.


결과.


그 과정에서 스크립트는 동기 OrderSend 실행의 버그를 보여줍니다(항상 처음은 아님).

수십/수백 밀리초 동안 OrderSend를 실행한 후 주문 가격은 OrderSend가 성공적으로 배치한 가격이 아니라 이전 가격입니다.


동일한 티켓의 주제로 돌아가서 몇 가지 결론을 도출할 수 있습니다.

  1. 부분 제한이 설정된 경우 생성된 거래는 "주문 및 거래" 탭에 표시되지 않습니다.
  2. 헤지에서 하나의 주문은 다른 가격으로 여러 IN 거래를 생성할 수 있습니다. 결과적으로 포지션을 여는 데 대한 분수(포인트 기준) 가격이 얻어집니다.
  3. Partial-deferred를 삭제하지 않고 형성된 포지션을 닫을 수 있습니다. 그러나 그 후에 연기가 작동하면 이전에 닫은 위치의 티켓과 동일한 티켓으로 거래가 열립니다. 저것들. 특정 티켓으로 포지션을 청산하는 상황이 있을 수 있습니다. 그런 다음 동일한 티켓으로 다시 위치가 나타납니다.
  4. 부분 실행은 브로커 소프트웨어에 따라 다양한 방식으로 구현될 수 있습니다. 위에서 표준 MT5 구현에 대해 설명했습니다.

추신 누군가 다른 거래 서버에서 재생산했다면 이름을 공유하십시오.

검색 문자열 : Osibka 010.

다시 부분적 성취의 문제로 돌아가겠습니다.

1. 3절에 따라 명확히 하십시오. "부분 연기를 삭제하지 않고 형성된 포지션을 청산할 수 있습니다. 그러나 그 이후 연기가 작동하면 이전에 마감된 포지션의 티켓과 동일한 티켓으로 거래가 열릴 것입니다. 즉, 특정 티켓으로 포지션을 닫았다가 같은 티켓으로 포지션이 다시 나타나는 상황이 있을 수 있습니다."
이 경우 POSITION_IDENTIFIER가 POSITION_TICKET과 같 습니까?

2. 앞서 "POSITION_TICKET != POSITION_IDENTIFIER" 스레드에서 다른 MT5 로직을 시연했습니다.

https://www.mql5.com/ru/forum/227423/page2#comment_6543129

fxsaber :

결과

이것이 브로커 해킹의 특성이 아니라 MT5의 일반적인 동작이라고 생각하면

  • ORDER_STATE_PARTIAL에는 과거 주문이 없습니다.
  • 채워진 주문의 상태는 항상 ORDER_STATE_FILLED입니다.
  • 부분 실행의 경우 해당하는 새로운 시장 주문이 거래 서버에 의해 생성됩니다(ORDER_REASON_CLIENT - 초기 주문이 자동으로 이루어진 경우에도(EXPERT)).
  • 이전 라이브 주문(티켓은 변경되지 않음)은 감소된 볼륨(ORDER_VOLUME_CURRENT)으로 계속 중단됩니다.
  • 동시에 이전 라이브 주문은 ORDER_STATE_PARTIAL 상태를 받습니다. 사실 이 플래그는 ORDER_VOLUME_CURRENT와 ORDER_VOLUME_INITIAL을 비교한 결과이다.
  • 열린 모든 위치는 ID == OrderTicket을 받습니다. Where OrderTicket - 거래 서버에서 생성한 티켓입니다.
  • 무역 거래에는 항상 정확히 하나의 역사적 주문이 있으며 그 상태는 ORDER_STATE_FILLED입니다.
  • 실행된 각 역사적 주문에는 정확히 하나의 거래가 있습니다.
  • 실행된 모든 주문의 경우 ORDER_VOLUME_INITIAL은 실행된 볼륨과 같습니다. 저것들. 전체 실행 후 원래 찢어진 주문의 ORDER_VOLUME_INITAL은 생성된 거래의 양과 같습니다.
  • (부분적으로 실행된) 원래 주문의 시간은 변경되지 않으며 거래 시간과 동일하지 않습니다.
  • 기록 테이블은 거래가 아닌 주문 시간(ORDER_TIME_SETUP)별로 정렬됩니다. 따라서 DEAL_TIME에서 HistorySelect를 수행하면 해당 주문을 기록 테이블에 가져오지 못할 수 있습니다.
  • HistorySelectByPosition은 항상 필요한 거래/주문 세트를 반환합니다.
  • 모든 거래 거래에 대해 슬리피지 금액을 계산할 수 있습니다.

귀하의 경험에 따르면 MT5에서 어떤 방식을 사용하는지 어떤 경우/동작 모드에 대한 일반적인 패턴이 있습니까?

3. 마지막으로 "POSITION_TICKET != POSITION_IDENTIFIER"가 발생한 실제 상황이 있습니까?

POSITION_TICKET != POSITION_IDENTIFIER
POSITION_TICKET != POSITION_IDENTIFIER
  • 2018.02.12
  • www.mql5.com
зная id позиции можно ли без перебора узнать тикет позиции...
 
mktr8591 :
매크로를 호출할 때 매개변수를 지정할 수 없습니다(건너뛰기). 때로는 매크로가 지정되지 않은 매개변수와 함께 작동할 가능성을 구체적으로 제공하고 싶을 때가 있습니다.
매크로에서 지정되지 않은 매개변수가 컴파일러에 의해 빈 문자열로 인식된다는 것이 밝혀졌습니다.
 
fxsaber :
매크로에서 지정되지 않은 매개변수가 컴파일러에 의해 빈 문자열로 인식된다는 것이 밝혀졌습니다.

어떻게 보면 네 , "빈 공간처럼"이라고 말하는 것이 더 나을 수도 있지만. 표현하기 어렵습니다. :-(.

그러나 #p는 정확히 문자열 ==""

 
mktr8591 :

어떻게 보면 네 , "빈 공간처럼"이라고 말하는 것이 더 나을 수도 있지만. 표현하기 어렵습니다. :-(.

그러나 #p는 정확히 문자열 ==""

고마워, 흥미로운 점.

 
Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2021.04.03
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
mktr8591 :

다시 부분적 성취의 문제로 돌아가겠습니다.

1. 3절에 따라 명확히 하십시오. "부분 연기를 삭제하지 않고 형성된 포지션을 청산할 수 있습니다. 그러나 그 이후 연기가 작동하면 이전에 마감된 포지션의 티켓과 동일한 티켓으로 거래가 열릴 것입니다. 즉, 특정 티켓으로 포지션을 닫았다가 같은 티켓으로 포지션이 다시 나타나는 상황이 있을 수 있습니다."
이 경우 POSITION_IDENTIFIER가 POSITION_TICKET과 같 습니까?

2. 앞서 "POSITION_TICKET != POSITION_IDENTIFIER" 스레드에서 다른 MT5 로직을 시연했습니다.

https://www.mql5.com/ru/forum/227423/page2#comment_6543129

귀하의 경험에 따르면 MT5에서 어떤 방식을 사용하는지 어떤 경우/동작 모드에 대한 일반적인 패턴이 있습니까?

3. 마지막으로 "POSITION_TICKET != POSITION_IDENTIFIER"가 발생한 실제 상황이 있습니까?

두 링크 모두 부분 실행의 서로 다른 구현에 대해 설명합니다. 이것은 MT5가 아닌 브로커 소프트웨어에 의해 결정됩니다.

티켓과 ID가 일치하지 않는 것을 보지 못했습니다.

 
고맙습니다.
 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

라이브러리: 사용법

fxsaber , 2021.05.01 14:17

GetMicrosecondCount 는 이전 호출보다 작은 값을 반환할 수 있습니다(ULONG 오버플로 없음). 그러한 상황의 예.
 2021.04 . 29 06 : 43 : 31.915    Alert : NewValue = 296000074313 , PrevValue = 296001329284

2021.04 . 29 06 : 43 : 32.149    Alert : NewValue = 296086250613 , PrevValue = 296087264090

2021.04 . 29 06 : 43 : 31.868    Alert : NewValue = 295129291901 , PrevValue = 295130576710

2021.04 . 29 06 : 43 : 32.180    Alert : NewValue = 295955613012 , PrevValue = 295956589070

2021.04 . 29 06 : 43 : 32.180    Alert : NewValue = 295146223171 , PrevValue = 295147199454

2021.04 . 29 06 : 43 : 32.149    Alert : NewValue = 295065995432 , PrevValue = 295067005968

2021.04 . 29 06 : 43 : 32.149    Alert : NewValue = 295078776581 , PrevValue = 295079787357

각 회선은 3개의 MT4 터미널에서 서로 다른 Expert Advisors에 의해 수신됩니다.

그리고 이것은 MT5에서 발생하지만 MT4에서는 훨씬 덜 자주 발생합니다.

조심하세요.

 
이 주제와 관련이 없는 댓글은 " MQL5 MT5 MetaTrader 5 초보자의 질문 "으로 이동되었습니다.
사유: