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

 

DBL_EPSILON の定義の説明:

void OnStart()
  {
   double epsilon = 1.0;
   while(1.0 + epsilon != 1.0)
      epsilon /= 2;
   epsilon *= 2;

   Print(epsilon);  // 2.220446049250313e-16
  }
 
fxsaber # :

これは悪い説明だ。

これは、標準的な数学的性質が倍数に対して保証されていないことの証明です。

あなたが提示した例では、掛け算に「分配的」性質を使用しています。
 

DBL_EPSILON の意味を説明するもう一つの方法がある:

//+------------------------------------------------------------------+
//| Returns the size of a unit in the last place (machine epsilon)   |
//| for a specified double value. This is the positive distance      |
//| between this double value and the representable value next       |
//| larger in magnitude.                                             |
//+------------------------------------------------------------------+
double machine_eps(const double value)
  {
   union _d {double value; long bits;} dbl;
   dbl.value = value;
   dbl.bits++;

   return dbl.value - value;
  }

void  OnStart()
  {
   double epsilon = machine_eps(1.0);

   Print(epsilon);   // 2.220446049250313e-16
  }

DBL_EPSILONは[1,2]内の連続する2倍点の間のギャップ・サイズに過ぎない。

https://www.exploringbinary.com/the-spacing-of-binary-floating-point-numbers/

https://en.wikipedia.org/wiki/Machine_epsilon

 

DBL_EPSILON を よりよく理解するために、浮動小数点 カウンタをインクリメントすることを考えてみましょう:

//+------------------------------------------------------------------+
//| Advances a fp double value by a specified number of epsilons.    |
//+------------------------------------------------------------------+
double DoubleAdvance(const double value, const long distance)
  {
   union _d {double value; long bits;} dbl;
   dbl.value = value;
   dbl.bits += distance;

   return dbl.value;
  }

void OnStart()
  {
   double myvalue = 1.0;
   //doubel myvalue = 1024.0;

   // Print the first 10 representable numbers from the counter
   for (int i = 0; i < 10; i++)
     {
      myvalue = DoubleAdvance(myvalue, 1);  // Increment the integer representation by 1 bit
      Print(myvalue);
     }
  }

カウンタの初期値が 1.0 の場合、カウンタのステッ プサイズ(ε)は小数点以下 16 位で 2.220446049250250313e-16(DBL_EPSILON)≈2 となります。

/*
1.0000000000000002
1.0000000000000004
1.0000000000000007
1.0000000000000009
1.000000000000001
1.0000000000000013
1.0000000000000016
1.0000000000000018
1.000000000000002
1.0000000000000022
*/

カウンタの初期値が1024の場合、カウンタのステップサイズ(ε )は、 小数点以下13 桁目で2.2737363675443232321e-13(1024 * DBL_EPSILON)≒2となります。

/*
1024.0000000000002
1024.0000000000005
1024.0000000000007
1024.000000000001
1024.0000000000011
1024.0000000000014
1024.0000000000016
1024.0000000000018
1024.000000000002
1024.0000000000023
*/

カウンタの初期値が4503599627370496 (2^52)の場合、カウンタのステップサイズは 1.0 (2^52 * DBL_EPSILON)= 1に なります この範囲では、doubleは整数カウンタのように振る舞い、端数は表現できません。

/*
 4503599627370497.0
 4503599627370498.0
 4503599627370499.0
 4503599627370500.0
 4503599627370501.0
 4503599627370502.0
 4503599627370503.0
 4503599627370504.0
 4503599627370505.0
 4503599627370506.0
*/

小さい数字ほど間隔が狭く、大きい数字ほど間隔が広いことがわかります。

したがって、DBL_EPSILON は相対誤差率である。relativeは数値の大きさに対する相対的なという意味である。

1.0では、絶対誤差 = 1 * 2.2204460492503131e-016 (DBL_EPSILON)。

d の場合、絶対誤差 ≈ d * DBL_EPSILON.

(DBL_EPSILONは1.0における参照レートで、銀行の年利のようなもので、2^-52に等しい)。


余談:1024.00000000003を表示しようとすると、代わりに1024.00000000002が表示されます(最も近い表現可能な数に丸められます)。1024.00000000003は表現可能な数(存在しないfp数)ではないからです。

これは表現エラーと呼ばれます:

void OnStart()
  {
   Print(1024.0000000000003);  // 1024.0000000000002
  }

前/次の表現可能な数値は、ビット操作(前と同じ enum: DoubleAdvance(値, -1))、または DBL_EPSILON を使って得られます:

void OnStart()
  {
   double myvalue = 1024.0000000000014;
   Print( myvalue * (1 - DBL_EPSILON) );  // 1024.0000000000011
   Print( myvalue * (1 + DBL_EPSILON) );  // 1024.0000000000016
  }

DBL_EPSILON は主に、倍精度に対する数学演算(数値解析)の後に fp の丸め誤差を推定(または修正)するために使用されます:

|真の結果 - fp の結果| / 真の結果 <= DBL_EPSILON

 

遺伝的最適化アルゴリズムが あり、カスタム 最適化基準がない場合、MT5テスターのOnTester()コールは無効になりますか?

そうではないと思います。しかし、そうしたいのですが...できればコンフィグ解析なしで。

PS.CARAUL!すべてがなくなった!最適化の各パスで(すべき/すべきでない) - OnTester()が呼び出され、最適化の総時間を大幅に増加させる可能性があります!

できる人、助けてください... )))))

 
IP_ADAPTER_INFOの 定義 方法を教えてください。これは値の 定義が正しく ありません
struct IP_ADAPTER_INFO { {の定義です。
// struct _IP_ADAPTER_INFO *Next; // 次のNIC情報。
uint ComboIndex; // コンボインデックス&#8252nbsp;
uchar AdapterName[256]; // NIC名
uchar Description[256]; // NICの説明。
uchar Address[6]; // MACアドレス &nbspuchar Address[6]; // MACアドレス。
uint AddressLength; // MACアドレスの長さ
uint Index; // NICインデックス
uint Type; // NICタイプNICタイプ; // NICタイプ
bool DhcpEnabled; // DHCPが有効かどうか。nbsp;; DhcpEnabled
uchar CurrentIpAddress[16];// 現在のIPアドレス
uchar IpAddressList[16]; // IPアドレスのリスト。
uchar GatewayList[16]; // デフォルトゲートウェイ
uchar DhcpServer[16]; // DHCPサーバ
datetime LeaseObtained; // リース取得時刻
datetime LeaseExpires; // リースの有効期限
}; datetime LeaseObtained; // リース取得。

#import "iphlpapi.dll"
int GetAdaptersInfo(IP_ADAPTER_INFO &AdapterInfo[], int &Size);
#インポート
 
現地時間より 少し早く移動すると、即座にトレードサーバーから切断される。
2023.05.24 11:11:15.645 '4999464569': connection to MetaQuotes-Demo lost
 

検索していたら、興味深いドキュメント化されていない機能を見つけました。

ダイアログボックスの入力コメントを非表示にできる

input int  param=0;  /* показываемый комментарий */   // комментарий для программиста

オリジナルの投稿はこちら

https://www.mql5.com/ru/forum/1271#comment_9019

Предложение по комментариям к внешним переменным
Предложение по комментариям к внешним переменным
  • 2010.06.30
  • www.mql5.com
Общее обсуждение: Предложение по комментариям к внешним переменным
 
lynxntech #:

検索しているうちに、興味深い文書化されていない関数に出くわした。

ダイアログボックスの入力コメントを非表示にできる

オリジナルの投稿はこちら

https://www.mql5.com/ru/forum/1271#comment_9019

ありがとう、見逃してた...。役に立つ。
 

テスターでは、履歴テーブルが上書きされるのは以下の2つの場合のみである。

  1. HistorySelectの呼び出し。
  2. OnTradeの呼び出し(指定されていなくても)。
これはリソースを節約するためです。そのため、このような曖昧さに遭遇する可能性があります。

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  const ulong Ticket1 = OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask - 1000 * _Point, 0, 0, 0);
  const ulong Ticket2 = OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask - 1000 * _Point, 0, 0, 0);

  OrderDelete(Ticket2);
  HistorySelect(0, INT_MAX); // Если убрать эту строку, то конечный Print-результат будет иным.
  
  OrderDelete(Ticket1);    
  HistorySelect(0, INT_MAX);
  
  for (int i = 0; i < HistoryOrdersTotal(); i++)
    Print(HistoryOrderGetTicket(i)); // 2 3 или 3 2.
      
  TesterStop();
}
検索文字列: Uluchshenie 064.