MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1206

 
Maxim Kuznetsov:

Alert("Разбег "+DoubleToString(delta,_Digits));

またはAlert(StringFormat("スプレッド %.5f",delta))が表示されます。

一般的には、同じ数の異なる表現に過ぎませんので、慣れてください。素晴らしい学生時代を思い出してください。そこから生まれるものです。

ありがとうございます。しかし、デルタ値を数値にして比較する必要がある場合はどうすればよいのでしょうか。例えば、こんな感じです。

if(delta>0.00005)
  {
   //------------
  }
ということでよろしいでしょうか?
 
prom18:

ありがとうございます。デルタ値を数値にして比較する必要がある場合はどうすればよいですか?例えば、こんな感じです。

これでよいのでしょうか?

2つの実数を比較すると、このようになります。

bool EqualDoubles(double d1,double d2,double epsilon)
  {
   if(epsilon<0) 
      epsilon=-epsilon;
//---
   if(d1-d2>epsilon) 
      return false;
   if(d1-d2<-epsilon) 
      return false;
//---
   return true;
  }

https://www.mql5.com/ru/docs/basis/types/double

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (или типы с плавающей точкой) представляют значения, имеющие дробную часть. В языке MQL5 есть два типа для чисел с плавающей точкой. Способ представления вещественных чисел в машинной памяти определен стандартом IEEE 754 и не зависит от платформ, операционных систем и языков программирования. Константы с плавающей точкой...
 
Mihail Matkovskij:

2つの実数を比較すると、このようになります。

https://www.mql5.com/ru/docs/basis/types/double

あまり近い意味にはなり得ないと確信があれば、そうすることもできます。やはり、ソフトはウォームと比較されますね。
 
Alexey Viktorov:
価値的にあまり近づけられないと確信できるのであれば、できます。やはり、ソフトはウォームと比較されますね。

理解できない。例えば、こんな感じです。1ティックで価格が何ピップス通過したか、その数を取るのです。20ポイント以上抜いたらアラートが 出る。

価格差(1.12300-1.12321=0.00021)と必要な最大値(0.00020)を比較しています。

0.00021>0.00020.

柔らかいとか暖かいとか、どういう関係があるんですか?

 
prom18:

理解できない。例えば、こんな感じです。1ティックで価格が何ピップス通過したか、その数を取るのです。20ポイント以上抜いたらアラートが出る。

価格差(1.12300-1.12321=0.00021)と必要な最大値(0.00020)を比較しています。

0.00021>0.00020.

柔らかいとか暖かいとか、どういう関係があるんですか?

点数が必要なので、点数を比較します。

で、double は epsilon (記憶が正しければ DBL_EPS) と比較されるので、そうでなければ 3.0-0.2 > 2.0+0.8 となります (比喩的に、数字は異なるかもしれません)。

 
Maxim Kuznetsov:

点数が必要なので、点数を比較してください。

倍はイプシロン(記憶が正しければ DBL_EPS)と比較され、そうでなければ 3.0-0.2 > 2.0+0.8 (比喩的に、数字は異なるかもしれません) となる可能性があります。

そのためには、@fxsaberの 例を使うのがよいでしょう。

int PriceToInteger( const double Price, const double point )
{
   return((int)(Price / point + 0.1));
}

スクリプトで確認することができます。

//+------------------------------------------------------------------+
void OnStart()
{
   int bar1 = PriceToInteger(iClose(NULL, 0, 1), _Point);
   int bar2 = PriceToInteger(iClose(NULL, 0, 2), _Point);
   printf("bar2 - bar1 = %i point", bar2 - bar1);
}
//+------------------------------------------------------------------+
int PriceToInteger( const double Price, const double point )
{
   return((int)(Price / point + 0.1));
}
//+------------------------------------------------------------------+
 
prom18:

理解できない。例えば、こんな感じです。1ティックで価格が何ピップス通過したか、その数を取るのです。20ポイント以上抜いたらアラートが出る。

価格差(1.12300-1.12321=0.00021)と必要な最大値(0.00020)を比較しています。

0.00021>0.00020.

柔らかいとか暖かいとか、どういう関係があるんですか?

まあ、書いてあることを全部読まなくてもいいこともあるんですけどね。

システムで普通に表現される数字を取ったんですね。これを持って...

  double a=1.12328,
         b=1.12309,
         c=0.00019,
         d=a-b;

を取得します。

1.1232800000000001
1.1230899999999999
0.00019
0.000190000000000135

a-b==cという考え方ですが、コンピュータはこのようなエラーを出します。掲示板にたくさん書かれていましたので、検索して読んでみてください。

しかし、正規化された差分と正規化されたコントロール値を取って比較することは可能です。

 
Иван:
皆さん、良い時間をお過ごしください。質問:MT4で、テスターでクロス(掛け値なしのペア)を使って作業する場合、テストが行われる口座がドル口座であれば、テスターはどのようにクローズしたポジションの 結果を計算するのでしょうか?ドル建てのポジション合計の再計算では、テスターは、現在の時点またはテスト区間の時点のクロスの基準通貨の 対ドル為替レートを採用するのでしょうか。現在のところ、そうであることを強く疑っています。その場合、インターバル時に計算させることは不可能なのでしょうか?
どなたかご存知ですか?
 
Иван:
どなたかご存知ですか?

MODE_TICKVALUE 自体を各ティック 毎にカウントします。

 
Alexey Viktorov:
価値的にあまり近づけられないと確信があれば、可能でしょう。やはり、ソフトはウォームと比較されますね。

もし、prom18 が、Digits 記号の範囲内で、2 つの数字を比較する必要がある場合、この方法が唯一の方法となります。

double price1 = 1.23450;
double price2 = 1.23447;

if(EqualDoubles(price1, price2, ((_Digits == 4) ? 0.0100 : 0.00100)) {
  ...
}

しかし、ご覧の通り、さらにバリエーションがあり、https://www.mql5.com/ru/forum/160683/page1205#comment_17247843。そのため、例ではあえて比較精度を2桁下げています。もちろん、このような価格価値の開きは、かなり不正確なのですが...。しかし、このような場合、他にどのように2つの数字を比較すればよいのでしょうか......?もし、偏差がDigits以上であれば、EqualDoublesを使わず、NormalizeDoubleを使って不要なものを切り捨てることも可能である。

とはいえ、こんな風にもできますけどね。

int digits = Digits() - 2;

double price1 = NormalizeDouble(1.23450, digits);
double price2 = NormalizeDouble(1.23447, digits);

if(price1 == price2) {
  ...
}