mql4 언어의 기능, 미묘함 및 작업 방법 - 페이지 6

 
fxsaber :
MQL5와 달리 MQL4에서 정적 배열 은 크기를 변경할 수 있습니다.
항상은 아님

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

MetaTrader 5 플랫폼 빌드 1595의 새 버전: 가격 기록에 액세스

fxsaber , 2017.05.01 16:36

 #property strict

template < typename T>
struct ARRAY
{
  T Simple[ 100 ];
};

void OnStart ()
{
   int ArraySimple[ 100 ];
  ARRAY< int > Array;

   Print ( ArrayResize (Array.Simple, 10 )); // MQL4: -1
   Print ( ArrayResize (ArraySimple, 10 ));   // MQL4: 10
  
   Print ( ArraySize (ArraySimple));         // MQL4: 10
   Print ( ArraySize (Array.Simple));       // MQL4: 100
}
 

Trailing Stop의 MT4에는 항상 버그가 있었습니다. 강한 가격 상승 움직임을 관찰하면,
그러면 SL이 위아래로 움직이는 것을 알 수 있습니다. 여기에서 나는 작은 움직임을 잡았습니다. 몇 배 더 많이 발생합니다.
2017.05.22 10:53:38.563 '9898616': 후행 정지 #1465775202 -> 1.29765
2017.05.22 10:53:38.483 '9898616': 후행 정지 #1465775202 -> 1.29764
2017.05.22 10:53:33.236 '9898616': 후행 정지 #1465775202 -> 1.29763
2017.05.22 10:53:33.130 '9898616': 후행 정지 #1465775202 -> 1.29764
2017.05.22 10:53:32.813 '9898616': 후행 정지 #1465775202 -> 1.29762
SL = 2(단순함을 위해 마지막 숫자)일 때 다음 틱에서 가격이 상승하고 터미널은 SL을 4로 올리라는 명령을 내렸습니다.
다음 틱에서 가격은 하락했고 SL은 여전히 2입니다. Termina는 SL을 3으로 올리라는 명령을 내렸습니다.
목이 긴 기린처럼 서버는 1차 주문을 처리한 후 SL을 4로 올렸고, 2차 주문을 처리한 서버는 LOWERED SL을 3으로 올렸다.
터미널에서 불필요한 무의미한 명령을 내림으로써 서버의 부하를 증가시키는 것으로 판명되었습니다.
또한, SL의 역방향 움직임으로 인해 트레이더에게 추가 손실의 위험이 있습니다.
이것은 Expert Advisor나 스크립트에 의한 프로그램 추적에도 적용됩니다 . SL을 3..5포인트씩 이동하여 부분적으로 수정했습니다.

할 일. 마지막 OrderModify 주문에서 발행된 SL 값을 기억하십시오.
그리고 이 값에서 생산할 다음 주문을 계산합니다.
다음과 같을 것입니다. 서버에 대한 주문이 두 번 줄어들고 SL은 앞으로만 이동하여 컴퓨터 프로세서의 부하를 줄입니다.
2017.05.22 10:53:38.563 '9898616': 후행 정지 #1465775202 -> 1.29765
2017.05.22 10:53:33.130 '9898616': 후행 정지 #1465775202 -> 1.29764
2017.05.22 10:53:32.813 '9898616': 후행 정지 #1465775202 -> 1.29762

 

주문을 수정할 때 이전 TP/SL을 새 변경 값과 비교해야 하는 경우가 많습니다. 왜냐하면 이전 값을 수정하려는 시도가 있으면 1번 오류가 발생합니다.

예를 들어 USDJPY(자릿수 = 2)에 대해 이전 SL(100.03)과 새 SL(100.02)을 비교해야 한다고 가정해 보겠습니다. 도움말은 다음과 같이 말합니다 .

두 번째 방법은 두 실수의 정규화 차이를 0과 비교하는 것입니다. 정규화된 숫자의 차이를 0과 비교하는 것은 쓸모가 없습니다. 정규화된 숫자를 사용한 수학 연산의 결과로 결과가 비정규화되기 때문입니다.

저것들. 다음과 같이 비교하십시오.

 if ( NormalizeDouble ( 100. 03 - 100. 02 , Digits ) != 0 ) // можно модифицировать

그러나 때때로 브로커는 비정규화된 가격을 제공할 수 있습니다. 예를 들어 가격은 100.02가 아니라 100.025입니다. 위의 계획에 따라 비교하면 0.01의 차이가 있습니다. 수정할 수 있습니다. 그러나 수정을 위해 Digits로 정규화된 100.025를 전달하면 실제로 100.03을 전달하므로 1번 오류가 발생합니다.

일반적으로 경험상 지금까지 수정을 위해 동일한 숫자를 사용하여 정규화된 숫자의 차이를 0과 비교하는 것이 더 낫다는 결론에 도달했습니다(참조에서는 권장하지 않음).

확인할 스크립트:

 void OnStart ()
{
   double a = 0.02 ;
   double b = 0.015 ;
  
   Print ( " norm1 dif=" , ND(a - b));             // результат = 0.01
   Print ( " norm2 dif=" , ND(a) - ND(b));         // результат = 0.0
}

double ND( double d) { return NormalizeDouble (d, 2 );}
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4
 
if(MathAbs(a-b)>=Point)
 
Yurij Kozhevnikov :
그래 넌 할수있어. 도움말에 나와 있는 첫 번째 비교 방법입니다. 나는 방금 문서에서 권장하는 두 번째 방법을 사용하여 빠진 실수 정규화의 함정을 지적했습니다.
 
이 주제와 관련이 없는 댓글은 " 주문 반복 주기의 구성"으로 이동되었습니다.
 

MT4의 OrderProfit()과 달리 OrderCommission()은 센트로 반올림되지 않은 데이터를 저장합니다.


ZY In OrderPrint() 커미션은 반올림됩니다(GUI에서와 같이).

 
fxsaber :

MT4의 OrderProfit()과 달리 OrderCommission()은 센트로 반올림되지 않은 데이터를 저장합니다.


ZY In OrderPrint() 커미션은 반올림됩니다(GUI에서와 같이).

따라서 올바른 OrderProfit()+OrderComission()+OrderSwap() 값을 얻으려면 어떻게 해야 합니까?

 
Artyom Trishkin :

따라서 올바른 OrderProfit()+OrderComission()+OrderSwap() 값을 얻으려면 어떻게 해야 합니까?

아무것도! 이것이 가장 정확한 의미입니다. 이러한 커미션 덕분에 GUI에서 총 커미션이 GUI에 표시되는 숫자의 합계와 1센트 차이가 나는 것을 볼 수 있습니다.

 
fxsaber :

아무것도! 이것이 가장 정확한 의미입니다. 이러한 커미션 덕분에 GUI에서 총 커미션이 GUI에 표시되는 숫자의 합계와 1센트 차이가 나는 것을 볼 수 있습니다.

그랬더니 전혀 이해가 되지 않았다. "OrderCommission()은 센트로 반올림되지 않은 데이터를 저장합니다" 는 무엇을 의미합니까? 둥근 부분은 어디입니까? 그리고 그들은 어떻게 반올림됩니까?