Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 232

 

DBL_EPSILON tanımının açıklaması:

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

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

Bu kötü bir açıklama, çünkü

Bu, standart matematiksel özelliklerin çiftler için garanti edilmediğinin bir kanıtıdır.

Verdiğiniz örnek çarpma işlemi için "dağıtma" özelliğini kullanmaktadır.
 

DBL_EPSILON'un anlamını açıklamanın başka bir yolu:

//+------------------------------------------------------------------+
//| 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 sadece [1,2)'deki ardışık çiftler arasındaki boşluk boyutudur.

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

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

 

DBL_EPSILON'u daha iyi anlamak için, kayan noktalı bir sayacı artırdığınızı düşünün:

//+------------------------------------------------------------------+
//| 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);
     }
  }

Sayacın ilk değeri 1.0 ise, sayacın adım boyutu (epsilon) 16. ondalık basamakta 2.220446049250313e-16 (DBL_EPSILON) ≈ 2 olacaktır.

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

Sayacın başlangıç değeri 1024 ise, sayacın adım boyutu (epsilon) 13. ondalık basamakta 2.27373675443232321e-13 (1024 * DBL_EPSILON) ≈ 2 olacaktır.

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

Sayacın başlangıç değeri 4503599627370496 (2^52) ise, sayacın adım boyutu 1.0 (2^52 * DBL_EPSILON)= 1 olacaktır. Bu aralıkta, bir double bir tamsayı sayacı gibi davranır, hiçbir kesir temsil edilemez.

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

Daha küçük sayıların aralarında daha küçük boşluklar olduğunu ve daha büyük sayıların aralarında daha büyük boşluklar olduğunu görebilirsiniz.

Bu nedenle, DBL_EPSILON göreli hata oranıdır. Göreceli, sayının büyüklüğüne göre anlamına gelir.

1.0'da mutlak hata = 1 * 2.2204460492503131e-016 (DBL_EPSILON).

d'de, mutlak hata ≈ d * DBL_EPSILON.

(DBL_EPSILON, bankanın yıllık faiz oranı gibi 1.0'da bir referans oranıdır ve 2^-52'ye eşittir).


Bir yan not: 1024.0000000000003 yazdırmaya çalışırsanız, bunun yerine 1024.0000000000002 yazdıracaktır (en yakın temsil edilebilir sayıya yuvarlayarak), çünkü 1024.0000000000003 temsil edilebilir bir sayı değildir (mevcut olmayan fp sayısı).

Buna temsil hatası denir:

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

Önceki/sonraki temsil edilebilir sayılara bit manipülasyonu (daha önce olduğu gibi enum: DoubleAdvance(value, -1)) veya DBL_EPSILON kullanılarak ulaşılır:

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

DBL_EPSILON temel olarak çiftler üzerindeki matematiksel işlemlerden (sayısal analiz) sonra fp yuvarlama hatalarını tahmin etmek (veya düzeltmek) için kullanılır:

|gerçek sonuç - fp sonucu| / gerçek sonuç <= DBL_EPSILON

 

Özel bir optimizasyon kriteri DEĞİL de bir genetik optimizasyon algoritması olduğunda OnTester() çağrısı MT5 test cihazında devre dışı bırakılıyor mu?

Sanırım hayır. Ama ben istiyorum ki... Tercihen yapılandırma ayrıştırması olmadan.

PS. CARAUL!!! Her şey gitti! Optimizasyonun her geçişinde (olmalı / olmamalı) - OnTester() çağrılır, bu da optimizasyonun toplam süresini büyük ölçüde artırabilir!

Kim yardım edebilir... )))))

 
IP_ADAPTER_INFO 'yu nasıl tanımlayacağımı söyleyebilir misiniz ? Bu değerin tanımı doğru değil
struct IP_ADAPTER_INFO {
// struct _IP_ADAPTER_INFO *Next; // Sonraki NIC bilgisi.
uint ComboIndex; // Combo indeksi & nbsp;
uchar AdapterName[256]; // NIC adı
uchar Açıklama[256]; // NIC'nin açıklaması.
uchar Adres[6]; // MAC adresi &nbsp uchar Adres[6]; // MAC adresi.
uint AddressLength; // MAC Adres Uzunluğu
uint Dizin; // NIC dizini
uint Tip; // NIC Tipi NIC Türü; // NIC Türü
bool DhcpEnabled; // DHCP'nin etkin olup olmadığı. nbsp;; DhcpEnabled
uchar CurrentIpAddress[16];// geçerli IP adresi
uchar IpAddressList[16]; // IP adreslerinin listesi.
uchar GatewayList[16]; // Varsayılan Ağ Geçidi
uchar DhcpServer[16]; // DHCP Sunucusu
datetime LeaseObtained; // Kira süresini al
datetime LeaseExpires; // Kira süresi sona erme zamanı
}; datetime LeaseObtained; // LeaseObtained.

#import "iphlpapi.dll"
int GetAdaptersInfo(IP_ADAPTER_INFO &AdapterInfo[], int &Size);
#import
 
Yerel saatin biraz ilerisine geçmek hemen ticaret sunucusuyla bağlantının kesilmesine yol açar.
2023.05.24 11:11:15.645 '4999464569': connection to MetaQuotes-Demo lost
 

Araştırmam sırasında belgelenmemiş ilginç bir fonksiyona rastladım

bir diyalog kutusu için giriş yorumunu gizleyebilirsiniz

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

orijinal gönderi burada

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

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

Araştırmam sırasında belgelenmemiş ilginç bir fonksiyona rastladım

bir diyalog kutusu için giriş yorumunu gizleyebilirsiniz

orijinal gönderi burada

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

Teşekkürler, kaçırdım... İşe yarar.
 

Tester'da Geçmiş tablosunun üzerine yalnızca iki durumda yazılır.

  1. HistorySelect çağrısı.
  2. OnTrade çağrısı (belirtilmemiş olsa bile).
Bu, kaynaklardan tasarruf etmek için yapılır. Bu yüzden böyle bir belirsizlikle karşılaşabilirsiniz.

#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();
}
Arama dizesi: Uluchshenie 064.