Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 142

 

Um die Anzahl der Überschreitungen der Optimierung zu reduzieren, verwende ich zwei Methoden, um eine nichtlineare Skala zu erstellen.

Aufzählung der Dauer in Stunden mit ausreichender Genauigkeit:

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

Zum Beispiel die SAR-Stufe mit einer Genauigkeit von 2 Ziffern (~1%) aufzählen:

// Приводит параметр оптимизации к нелинейному виду
// 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;
}

Eine Optimierung von 0,0001 bis 0,99 würde fast 10K Schritte erfordern. Die Verwendung der Codes 001-299 bei der Optimierung würde weniger als 300 Schritte erfordern.

 
Eine Möglichkeit, auch mit einem Scheck eine Division durch Null zu erreichen.
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    
}


Der Fehler ist in der Tat eindeutig. Aber beim Schreiben von Code wie diesem ist es nicht immer offensichtlich, dass eine solche Prüfung nicht ausreicht, um eine Division durch Null zu vermeiden.

 
Eine Ausrede, um den ternären Operator nicht zu verwenden.
 
TheXpert:
Eine Ausrede, um den ternären Operator nicht zu verwenden.

Wenn es ähnlich ist, natürlich.

 

Erwarten Sie nur nicht, dass, wenn es keinen Wert gibt, dieser zwangsläufig 0 und damit falsch ist, wenn es sich nicht um eine Variable vom Typ bool handelt. Selbst eine explizite Konvertierung in den Typ bool kann ihn nicht retten.

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

So funktioniert es ohne Fehler.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Eigenheiten von mql5, Tipps und Tricks

Alexey Viktorov, 2019.10.28 10:22

Man erwartet einfach nicht, dass, wenn es keinen Wert gibt, dieser zwangsläufig 0 ist und daher falsch, wenn es sich nicht um eine Variable vom Typ bool handelt. Auch eine explizite Konvertierung in den Typ bool wird nicht gespeichert.

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

So funktioniert es ohne Fehler.

An der hervorgehobenen Stelle befindet sich ein Fehler.
 
fxsaber:
An der hervorgehobenen Stelle befindet sich ein Fehler.

Ich kann den Höhepunkt nicht sehen. Worin besteht der Fehler?

 
fxsaber:
An der hervorgehobenen Stelle befindet sich ein Fehler.

Sie haben "==" geschrieben, es sollte "!=" sein.

Es ist "sehr blassgelb" unterstrichen :)

 
Artyom Trishkin:

Sie haben "==" geschrieben, es sollte "!=" sein.

Es ist "sehr blassgelb" unterstrichen :)

Nun, nicht jeder weiß, dass ich wie dieser Affe bin: "Ich bin schwach in den Augen, wenn ich alt bin."

Ich denke schon, aber aus irgendeinem Grund funktionierte es ohne Division durch 0. Und im Allgemeinen war meine Botschaft, dass wir keine Variable auf 0 als booleschen Wert für falsch prüfen sollten.

 
Alexey Viktorov:

Ich denke schon, aber aus irgendeinem Grund hat es ohne Division durch 0 funktioniert.

Weil TickValue nicht Null ist.