MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1206

 
Maxim Kuznetsov :

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

veya Alert(StringFormat("Çalıştır %.5f",delta));

ve genellikle buna alışırsınız, bunlar sadece aynı sayının farklı temsilleridir. Harika okul yıllarını hatırlayın - bu oradan

Teşekkür ederim. Delta değerini sayı olarak kullanmam ve karşılaştırmam gerekirse ne olur? Örneğin.

 if (delta> 0.00005 )
  {
   //------------
  }
doğru olacak mı?
 
prom18 :

Teşekkür ederim. Delta değerini sayı olarak kullanmam ve karşılaştırmam gerekirse ne olur? Örneğin.

doğru olacak mı?

Bunun gibi iki gerçek sayıyı karşılaştırabilirsiniz:

 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 :

Bunun gibi iki gerçek sayıyı karşılaştırabilirsiniz:

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

Değerlerinin çok yakın olamayacağından eminseniz yapabilirsiniz. Sonuçta, yumuşak sıcak ile karşılaştırılır.
 
Alexey Viktorov :
Değerlerinin çok yakın olamayacağından eminseniz yapabilirsiniz. Sonuçta, yumuşak sıcak ile karşılaştırılır.

anlamadım Örneğin. Fiyatın geçtiği puan sayısını tek bir tıklamada alıyorum. Fiyat 20 puandan fazlaysa, Uyarı açılır.

Görünüşe göre fiyat farkını (1.12300-1.12321=0.00021) ihtiyacım olan herhangi bir maksimum değerle (0.00020) karşılaştırıyorum.

0.00021>0.000020.

Peki ya yumuşak ve sıcak?

 
prom18 :

anlamadım Örneğin. Fiyatın geçtiği puan sayısını bir tikte alıyorum. Fiyat 20 puandan fazlaysa, Uyarı açılır.

Görünüşe göre fiyat farkını (1.12300-1.12321=0.00021) ihtiyacım olan herhangi bir maksimum değerle (0.00020) karşılaştırıyorum.

0.00021>0.000020.

Peki ya yumuşak ve sıcak?

puanlara ihtiyacın var, bu yüzden puanları karşılaştır, bu arada, onlar bütün.

ve double epsilon içinde ile karşılaştırılır (bellek çalışıyorsa DBL_EPS), aksi takdirde 3.0-0.2 > 2.0+0.8 olduğu ortaya çıkabilir (mecazi olarak sayılar farklı olabilir)

 
Maxim Kuznetsov :

puanlara ihtiyacın var, bu yüzden puanları karşılaştır, bu arada, onlar bütün.

ve double, epsilon doğruluğu ile karşılaştırılır (bellek çalışıyorsa DBL_EPS), aksi takdirde 3.0-0.2 > 2.0+0.8 olduğu ortaya çıkabilir (mecazi olarak, sayılar farklı olabilir)

o zaman bu amaçlar için @fxsaber örneğini kullanmak daha iyidir:

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

kontrol edilecek komut dosyası:

 //+------------------------------------------------------------------+
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 :

anlamadım Örneğin. Fiyatın geçtiği puan sayısını tek bir tıklamada alıyorum. Fiyat 20 puandan fazlaysa, Uyarı açılır.

Görünüşe göre fiyat farkını (1.12300-1.12321=0.00021) ihtiyacım olan herhangi bir maksimum değerle (0.00020) karşılaştırıyorum.

0.00021>0.000020.

Peki ya yumuşak ve sıcak?

Bazen yazılan her şeyi okumak zorunda değilsin.

Normalde sistem tarafından temsil edilen sayıları aldınız. Bunları al

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

ve Al

 1.1232800000000001
1.1230899999999999
0.00019
0.000190000000000135

teoride ab == c ama bilgisayar bu tür hatalar verecektir. Bu konuda forumda çok şey yazıldı, araştırın ve okuyun.

Ancak normalleştirilmiş farkı ve normalleştirilmiş kontrol değerini alabilir ve karşılaştırabilirsiniz.

 
Иван :
Herkese iyi eğlenceler. Soru: MT4'te, test cihazında haçlarla (dolarsız çiftler) çalışırken, testin test edildiği hesap dolar cinsinden ise, test cihazı kapalı pozisyonların sonuçlarını nasıl hesaplar? Toplam pozisyonu dolara dönüştürmek için test cihazı, mevcut anda veya incelenen aralık anında dolar karşısında çaprazın temel para biriminin döviz kurunu alıyor mu? Şu anda bundan şiddetle şüpheleniyorum. Eğer öyleyse, aralık zamanında saymaya zorlamak mümkün mü?
Kimse biliyor mu?
 
Иван :
Kimse biliyor mu?

her tik için MODE_TICKVALUE'nin kendisini hesaplayın.

 
Alexey Viktorov :
Değerlerinin çok yakın olamayacağından eminseniz yapabilirsiniz. Sonuçta, yumuşak sıcak ile karşılaştırılır.

prom18'in Rakam karakterleri içindeki iki sayıyı karşılaştırması gerekiyorsa, yalnızca bu yöntem uygundur:

 double price1 = 1.23450 ;
double price2 = 1.23447 ;

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

Ancak, görebileceğiniz gibi, daha da yayıldı: https://www.mql5.com/ru/forum/160683/page1205#comment_17247843 . Bu nedenle, örnekte, karşılaştırma doğruluğunu kasıtlı olarak iki basamak azalttım. Tabii ki, fiyat değerlerinde böyle bir yayılma oldukça yanlış... Ama bu gibi durumlarda iki sayıyı başka nasıl karşılaştırabiliriz?... Sapma Digits için olsaydı, EqualDoubles kullanılamazdı, ancak gereksiz olan her şeyi keserdi. NormalizeDouble kullanarak.

Ancak şunu da yapabilirsiniz:

 int digits = Digits () - 2 ;

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

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