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    
}


这个错误在事实上是很明显的。但在编写这样的代码时,并不总是很明显,这样的检查并不足以避免除以零。

 
一个不使用三元运算符 的借口。
 
TheXpert:
一个不使用三元运算符 的借口。

当然,如果类似的话。

 

只是不要指望如果没有值,就一定是0,因此是假的,如果它不是一个bool类型的 变量。即使明确地转换为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的特殊性,技巧和窍门

Alexey Viktorov, 2019.10.28 10:22

你只是没有想到,如果没有值,就一定是0,因此如果不是bool类型的 变量,就是假的。即使明确转换为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的情况下也能工作。 而总的来说,我的信息是,我们不应该把任何变量的0当作布尔值的假来检查。

 
Alexey Viktorov:

我想是的,但由于某些原因,没有除以0也能成功。

因为TickValue不是零。