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

 

최적화 매개변수의 반복 횟수를 줄이기 위해 비선형 척도를 생성하는 두 가지 방법을 사용합니다.

충분한 정확도로 시간 단위로 기간을 반복하려면 다음을 수행하십시오.

enum eHours { _0, _4, _6, _8, _12, _16, _24, _32, _48, _64, _96, _128 };

input eHours TrendHours = _8;

int
eHours2Hours(eHours e) {
	switch (e) {
	case _0:	return 0;
	case _4:	return 4;
	case _6:	return 6;
	case _8:	return 8;
	case _12:	return 12;
	case _16:	return 16;
	case _24:	return 24;
	case _32:	return 32;
	case _48:	return 48;
	case _64:	return 64;
	case _96:	return 96;
	case _128:	return 128;
	default:	return -1;
	}
}

예를 들어 2자리(~1%)의 정확도로 SAR 단계를 열거하려면:

 // Приводит параметр оптимизации к нелинейному виду
// 001-099 >> 0.0001-0.0099
// 101-199 >> 0.001-0.099
// 201-299 >> 0.10-0.99
// Внимание: коды 000, 100, 200 возвращают 0.0
double
NonlinPar( int code) {
         int order = code / 100 ;
         int mod = code - order * 100 ;
         return mod * MathPow ( 10 , order) / 10000 ;
}

0.0001에서 0.99로 최적화하려면 거의 10K 단계가 필요합니다. 최적화에서 코드 001-299를 사용할 때 300단계 미만이 필요합니다.

 
체크를 해도 0으로 나누는 방법.
 void OnStart ()
{  
   const double Profit = 100 ;
   const double Lots = 1 ;

   double TickValue[];  
   ArrayResize (TickValue, 1 );
  
   const double Points = TickValue[ 0 ] ? Profit / (Lots * TickValue[ 0 ] * _Point ) : 0 ; // zero divide     
}


오류는 분명합니다. 그러나 그러한 코드를 작성할 때 그러한 검사가 0으로 나누는 것을 피하기에 충분하지 않다는 것이 항상 분명한 것은 아닙니다.

 
삼항 연산자 를 사용하지 않는 이유.
 
TheXpert :
삼항 연산자 를 사용하지 않는 이유.

물론 비슷하다면 말이다.

 

값이 없으면 반드시 0이고, 따라서 이것이 bool 유형 이 아닌 변수인 경우 false가 되기를 바랄 필요는 없습니다. bool에 대한 명시적 캐스트조차도 도움이되지 않습니다.

 void OnStart ()
{  
   const double Profit = 100 ;
   const double Lots = 1 ;

   double TickValue[];  
   ArrayResize (TickValue, 1 );
  
   const double Points = TickValue[ 0 ] == 0? Profit / (Lots * TickValue[ 0 ] * _Point ) : 0 ;   
}

이것은 오류 없이 작동합니다.

 

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

mql5 언어의 특징, 미묘함 및 작업 방법

알렉세이 빅토 로프 , 2019.10.28 10:22

값이 없으면 반드시 0이고, 따라서 이것이 bool 유형 이 아닌 변수인 경우 false가 되기를 바랄 필요는 없습니다. bool에 대한 명시적 캐스트조차도 도움이되지 않습니다.

 void OnStart ()
{  
   const double Profit = 100 ;
   const double Lots = 1 ;

   double TickValue[];  
   ArrayResize (TickValue, 1 );
  
   const double Points = TickValue[ 0 ] = = 0? Profit / (Lots * TickValue[ 0 ] * _Point ) : 0 ;   
}

이것은 오류 없이 작동합니다.

강조 표시된 영역에 오류가 있습니다.
 
fxsaber :
강조 표시된 영역에 오류가 있습니다.

전용공간이 안보이네요. 실수는 어디에 있습니까?

 
fxsaber :
강조 표시된 영역에 오류가 있습니다.

"=="라고 썼지만 "!="이어야 합니다.

"매우 옅은 노란색"으로 강조 표시되어 있습니다. :)

 
Artyom Trishkin :

"=="라고 썼지만 "!="이어야 합니다.

"매우 옅은 노란색"으로 강조 표시되어 있습니다. :)

뭐, 역시 내가 저 원숭이 같은 걸 모두가 아는 건 아니잖아. "나이 들어서 눈이 약해졌어."

아마도 그렇습니다. 그러나 어떤 이유에서인지 이 옵션은 0으로 나누지 않고 작동했습니다. 그러나 일반적으로 제 메시지는 false에 대한 부울 값으로 모든 변수가 0인지 확인할 필요가 없다는 것입니다.

 
Alexey Viktorov :

아마도 예, 하지만 어떤 이유로 이 옵션은 0으로 나누지 않고 작동했습니다.

TickValue가 null이 아니기 때문입니다.