Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 142

 

Optimizasyon parametrelerinin yineleme sayısını azaltmak için doğrusal olmayan bir ölçek oluşturmak için iki yöntem kullanıyorum.

Süreyi saat cinsinden yeterli doğrulukla yinelemek için:

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;
	}
}

Örneğin, SAR adımını 2 basamak (~%1) doğrulukla numaralandırmak için:

 // Приводит параметр оптимизации к нелинейному виду
// 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'den 0.99'a optimizasyon, neredeyse 10K adım gerektirecektir. Optimizasyonda 001-299 kodlarını kullanırken 300'den az adım gereklidir.

 
Bir çekle bile sıfıra bölmenin bir yolu.
 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     
}


Hata açık. Ancak böyle bir kod yazarken, böyle bir kontrolün sıfıra bölmeyi önlemek için yeterli olmadığı her zaman açık değildir.

 
Üçlü operatörü kullanmama nedeni .
 
TheXpert :
Üçlü operatörü kullanmama nedeni .

Tabii eğer benzerse.

 

Sadece değer yoksa, mutlaka 0 olacağını ve buna göre bool türünde olmayan bir değişkense false olacağını ummak gerekli değildir. Bool için açık bir oyuncu seçimi bile yardımcı olmaz.

 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 ;   
}

Bu hatasız çalışır.

 

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri

Alexey Viktorov , 2019.10.28 10:22

Sadece değer yoksa, mutlaka 0 olacağını ve buna göre bool türünde olmayan bir değişkense false olacağını ummak gerekli değildir. Bool için açık bir oyuncu seçimi bile yardımcı olmaz.

 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 ;   
}

Bu hatasız çalışır.

Vurgulanan alanda bir hata var.
 
fxsaber :
Vurgulanan alanda bir hata var.

Özel bir alan görmüyorum. Hata nerede?

 
fxsaber :
Vurgulanan alanda bir hata var.

"==" yazdınız, ancak "!=" olmalı

"Çok soluk sarı" ile vurgulanır :)

 
Artyom Trishkin :

"==" yazdınız, ancak "!=" olmalı

"Çok soluk sarı" ile vurgulanır :)

Ne de olsa benim o maymun gibi olduğumu herkes bilmiyor "Yaşlılıkta gözlerim zayıflıyor."

Muhtemelen evet, ama nedense bu seçenek 0'a bölmeden çalıştı. Ama genel olarak mesajım, herhangi bir değişkeni false için boole olarak kontrol etmenin gerekli olmadığıydı.

 
Alexey Viktorov :

Muhtemelen evet, ama nedense bu seçenek 0'a bölünmeden çalıştı.

Çünkü TickValue boş değil.

Neden: