매크로를 호출할 때 매개변수를 지정할 수 없습니다(건너뛰기). 때로는 매크로가 지정되지 않은 매개변수와 함께 작동할 가능성을 구체적으로 제공하고 싶을 때가 있습니다.
이러한 경우 몇 가지 보조 매크로를 제공합니다.
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( conststring p = NULL ) { return"" == p;}
template < typename T> bool __hlp_macro_func(T p) { returntrue ;}
template < typename T> bool __hlp_macro_func(T& p) { returntrue ;}
template < typename T> bool __hlp_macro_func(T& p[]) { returntrue ;}
//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; };
voidOnStart ()
{
//---Print (IS_PARAMETER_SET()); //falsePrint (IS_PARAMETER_SET( "" )); //truePrint (IS_PARAMETER_SET( "test" )); //truePrint (IS_PARAMETER_SET( NULL )); //truePrint (IS_PARAMETER_SET( 0 )); //truePrint (IS_PARAMETER_SET( 1 )); //truestring str;
Print (IS_PARAMETER_SET(str)); //trueint 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 )); //1Print (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
}
RannForex-Server 데모 계정에 다음 코드가 있으면 이 Expert Advisor를 실행하면 이 상황을 즉시 재현할 수 있습니다.
결과.
그 과정에서 스크립트는 동기 OrderSend 실행의 버그를 보여줍니다(항상 처음은 아님).
수십/수백 밀리초 동안 OrderSend를 실행한 후 주문 가격은 OrderSend가 성공적으로 배치한 가격이 아니라 이전 가격입니다.
동일한 티켓의 주제로 돌아가서 몇 가지 결론을 도출할 수 있습니다.
부분 제한이 설정된 경우 생성된 거래는 "주문 및 거래" 탭에 표시되지 않습니다.
헤지에서 하나의 주문은 다른 가격으로 여러 IN 거래를 생성할 수 있습니다. 결과적으로 포지션을 여는 데 대한 분수(포인트 기준) 가격이 얻어집니다.
Partial-deferred를 삭제하지 않고 형성된 포지션을 닫을 수 있습니다. 그러나 그 후에 연기가 작동하면 이전에 닫은 위치의 티켓과 동일한 티켓으로 거래가 열립니다. 저것들. 특정 티켓으로 포지션을 청산하는 상황이 있을 수 있습니다. 그런 다음 동일한 티켓으로 다시 위치가 나타납니다.
부분 실행은 브로커 소프트웨어에 따라 다양한 방식으로 구현될 수 있습니다. 위에서 표준 MT5 구현에 대해 설명했습니다.
1. 3절에 따라 명확히 하십시오. "부분 연기를 삭제하지 않고 형성된 포지션을 청산할 수 있습니다. 그러나 그 이후 연기가 작동하면 이전에 마감된 포지션의 티켓과 동일한 티켓으로 거래가 열릴 것입니다. 즉, 특정 티켓으로 포지션을 닫았다가 같은 티켓으로 포지션이 다시 나타나는 상황이 있을 수 있습니다." 이 경우 POSITION_IDENTIFIER가 POSITION_TICKET과 같습니까?
2. 앞서 "POSITION_TICKET != POSITION_IDENTIFIER" 스레드에서 다른 MT5 로직을 시연했습니다.
1. 3절에 따라 명확히 하십시오. "부분 연기를 삭제하지 않고 형성된 포지션을 청산할 수 있습니다. 그러나 그 이후 연기가 작동하면 이전에 마감된 포지션의 티켓과 동일한 티켓으로 거래가 열릴 것입니다. 즉, 특정 티켓으로 포지션을 닫았다가 같은 티켓으로 포지션이 다시 나타나는 상황이 있을 수 있습니다." 이 경우 POSITION_IDENTIFIER가 POSITION_TICKET과 같습니까?
2. 앞서 "POSITION_TICKET != POSITION_IDENTIFIER" 스레드에서 다른 MT5 로직을 시연했습니다.
이러한 경우 몇 가지 보조 매크로를 제공합니다.
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가 문자열이면 잘못 작동합니다!
코드 및 사용 예:
RannForex-Server 데모 계정에 다음 코드가 있으면 이 Expert Advisor를 실행하면 이 상황을 즉시 재현할 수 있습니다.
결과.
그 과정에서 스크립트는 동기 OrderSend 실행의 버그를 보여줍니다(항상 처음은 아님).
수십/수백 밀리초 동안 OrderSend를 실행한 후 주문 가격은 OrderSend가 성공적으로 배치한 가격이 아니라 이전 가격입니다.
동일한 티켓의 주제로 돌아가서 몇 가지 결론을 도출할 수 있습니다.
추신 누군가 다른 거래 서버에서 재생산했다면 이름을 공유하십시오.
검색 문자열 : Osibka 010.
다시 부분적 성취의 문제로 돌아가겠습니다.
1. 3절에 따라 명확히 하십시오. "부분 연기를 삭제하지 않고 형성된 포지션을 청산할 수 있습니다. 그러나 그 이후 연기가 작동하면 이전에 마감된 포지션의 티켓과 동일한 티켓으로 거래가 열릴 것입니다. 즉, 특정 티켓으로 포지션을 닫았다가 같은 티켓으로 포지션이 다시 나타나는 상황이 있을 수 있습니다."
이 경우 POSITION_IDENTIFIER가 POSITION_TICKET과 같 습니까?
2. 앞서 "POSITION_TICKET != POSITION_IDENTIFIER" 스레드에서 다른 MT5 로직을 시연했습니다.
https://www.mql5.com/ru/forum/227423/page2#comment_6543129결과
이것이 브로커 해킹의 특성이 아니라 MT5의 일반적인 동작이라고 생각하면
귀하의 경험에 따르면 MT5에서 어떤 방식을 사용하는지 어떤 경우/동작 모드에 대한 일반적인 패턴이 있습니까?
3. 마지막으로 "POSITION_TICKET != POSITION_IDENTIFIER"가 발생한 실제 상황이 있습니까?
매크로를 호출할 때 매개변수를 지정할 수 없습니다(건너뛰기). 때로는 매크로가 지정되지 않은 매개변수와 함께 작동할 가능성을 구체적으로 제공하고 싶을 때가 있습니다.
매크로에서 지정되지 않은 매개변수가 컴파일러에 의해 빈 문자열로 인식된다는 것이 밝혀졌습니다.
어떻게 보면 네 , "빈 공간처럼"이라고 말하는 것이 더 나을 수도 있지만. 표현하기 어렵습니다. :-(.
그러나 #p는 정확히 문자열 ==""
어떻게 보면 네 , "빈 공간처럼"이라고 말하는 것이 더 나을 수도 있지만. 표현하기 어렵습니다. :-(.
그러나 #p는 정확히 문자열 ==""
고마워, 흥미로운 점.
@fxsaber
이 질문을 보십시오: https://www.mql5.com/ru/forum/170952/page201#comment_21964923
다시 부분적 성취의 문제로 돌아가겠습니다.
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 오버플로 없음). 그러한 상황의 예.각 회선은 3개의 MT4 터미널에서 서로 다른 Expert Advisors에 의해 수신됩니다.
그리고 이것은 MT5에서 발생하지만 MT4에서는 훨씬 덜 자주 발생합니다.
조심하세요.