mql5言語の特徴、微妙なニュアンスとテクニック - ページ 142

 

最適化のオーバーシュートを少なくするために、2つの方法で非線形スケールを作っています。

十分な精度で継続時間を時間単位で列挙すること。

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

例えば、SARステップを2桁(~1%)の精度で列挙すること。

// Приводит параметр оптимизации к нелинейному виду
// 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まで最適化すると、ほぼ1万ステップ必要です。コード 001~299を最適 化に使用すると、300ステップ未満で済みます。

 
チェックを入れてもゼロで割り算に 走る方法。
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:
三項演算 子を使わない言い訳。

もちろん、似たような場合にも。

 

ただ、値がない場合、bool型 変数でなければ、必ずしも0であり、したがって偽であるとは思わないでください。明示的に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型 変数でなければ偽である、ということを想定していないだけなのです。明示的に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をブーリアンとしてfalseでチェックしてはいけないというのが私のメッセージです。

 
Alexey Viktorov:

だと思うのですが、なぜか0で割らなくても動きました。

TickValueが0でないため。

理由: