Double vs FLOAT - anlaşılmaz MathFloor hatası - sayfa 6

 
fxsaber :
Evet.
teşekkürler
 
Vladislav Andruschenko :
teşekkürler
İlk sayfada, çözüm yatıyor ... zaten altıncı.
 
fxsaber :
O zaman neden normalleştirme ve MathFloor olmadan çalışıyor?
Giriş 0,95 ise?
 
Dmitry Fedoseev :
Giriş 0,95 ise?
anlamadım
 
Vladislav Andruschenko :
Ne almanız gerektiğini tam olarak anlayamayabilirim, ancak bu seçeneğe bakın
void OnStart ()
{
double ask2 = 1.55557 , ask3 = 1.55558 , bid = 1.55555 ;
   Print ( "(ask2 + bid)/2 = " , (ask2 + bid)/ 2 );
   Print ( "(ask3 + bid)/2 = " , (ask3 + bid)/ 2 );
     int avPrice_2 = ( int ) NormalizeDouble ((ask2/ _Point + bid/ _Point )/ 2 , 0 );
   int avPrice_3 = ( int ) NormalizeDouble ((ask3/ _Point + bid/ _Point )/ 2 , 0 );
   Print ( "avPrice_2 = " , avPrice_2);
Print ( "avPrice_3 = " , avPrice_3);
} /*******************************************************************/
sonuç
2017.02 . 27 00 : 03 : 54.453 00 (EURUSD.m,H1)        (ask2 + bid)/ 2 = 1.55556
2017.02 . 27 00 : 03 : 54.456 00 (EURUSD.m,H1)        (ask3 + bid)/ 2 = 1.555565
2017.02 . 27 00 : 03 : 54.456 00 (EURUSD.m,H1)        avPrice_2 = 155556
2017.02 . 27 00 : 03 : 54.456 00 (EURUSD.m,H1)        avPrice_3 = 155557
 

"Sor ve Bid'i alıyoruz ve ortalama fiyatı hesaplıyoruz. Fark tek ise (3,5,7,9 vb.) o zaman ortalama fiyatı Bid'e daha yakın eşitleriz."

Görev ayarlanmadı:

- bu da tuhaf yayılma anlamına gelir. Puan için 1,3,..,9 kez veya Puan için 1,3,..,17,57 kez? Yuvarlama tek segmentler içinde çalışır...

- "Teklif'e daha yakın" ne anlama geliyor? Özellikle, yayılma, örneğin Point'ten 43 kat daha büyükse. Bid'i neyle eşitlemekle ilgili?

İlk olarak, problemde netlik gereklidir, ancak o zaman kesin bir karar vermek mümkün olacaktır.

Aynı zamanda çift/tek'ten bahsettiğimiz için bu kavramın anlam kazandığı tam sayılara geçmek mantıklı olacaktır.

double Ask , Bid ,Middle; // Уже известные курсы Ask и Bid, вычисляемый средний курс
int Mash,Spr; // Множитель перехода к целым числам. Для 4-разрядного EURUSD 10000. И целочисленный спред

Mash= MathRound ( 1.0 / _Point );
Spr= MathRound (( Ask - Bid )*Mash); // Целочисленный спред
// Придаем конкретность среднему курсу.  Предполагаем, что "ближе к Бид" значит "ближайший меньший среднего арифметического Ask и Bid, кратный Point"
Spr=Spr >> 1 ; // Целочисленный спред, деленный на 2 с отбрасыванием остатка
Middle= Bid +Spr*_ Point ;


// Если предположение неверно, канва последующих разборов такая
if ((Spr &   1 )  != 0 )) {   // Спред нечетный
  }
else {   // Спред четный
  }

 
Çok basit bir görevde benzer bir şey başıma geldi - komut dosyası zaman serisinden EURUSD günlük açılış fiyatlarını bir çift diziye okudu ve ardından bu diziyi bir . Fiyat birden fazla olduğu sürece her şey yolundaydı. Ancak sıfır yılda fiyat 1'in altına düştüğünde, bazen, sık sık değil, yılda yaklaşık 20 kez, bazı tuhaflıklar ortaya çıkmaya başladı - 15. ondalık basamağın bir yerinde, biri çıkarılmaya başladı, doğal olarak öncekilerin tümü 9. oldu. Saçmalık gibi ama güzel değil. Her yerde ve okumadan sonra ve dosyaya yazmadan önce ve yazma sırasında normalleştirme yaptım ve normalleştirme ile bir diziden diğerine damıttım - hiçbir şey yardımcı olmadı. Zaman serisini okurken 1 eklediyse, her şey yolundaydı. Genel olarak, sonunda bundan bıktım, dubleyi yüzmeye değiştirdim ve sakinleştim.
 
Vladimir :

"Sor ve Bid'i alıyoruz ve ortalama fiyatı hesaplıyoruz. Fark tek ise (3,5,7,9 vb.) o zaman ortalama fiyatı Bid'e daha yakın eşitleriz."

Görev ayarlanmadı:

Aslında, görev basit görünüyor? Ve bir öğrenci yapabilir mi? :-) Ben de öyle düşünmüştüm.

Ancak sunucudan alınan fiyatlarda, veri normalizasyonunda ve diğerlerinde - o kadar karanlık köşeler var ki, hiç bahsetmiyorum bile.

9 yıldır mql'de programlama yapıyorum - ve normalleştirme ile hiç problem yaşamadım çünkü doğru algıladım. ve 1 milinoktaya kadar doğruluk her zaman doğru çalıştı.

Ama görevler var. yüksek hassasiyet gerektirir.

Ve şartlar var.

Yani:

  1. ASK ve BID fiyatlarını alıyoruz - ortalama fiyatını hesaplıyoruz = her şey basit mi? TAMAM.
  2. Buna göre, eğer spread tek ise (örneğin 3 puan), o zaman kalansız bölemeyiz, değil mi?

Bu nedenle, fiyatı normalleştirmemiz gerekiyor, böylece bir denge varsa (ve eşit bir dağılımla olacak! :-)), o zaman fiyatı en alt noktaya daha yakın bir şekilde ortalamalıyız, yani. açık arttırma.

Örneğin:

  • sor = 1.23455 teklif = 1.23457 spread = 2 Ortalama fiyat: 1.23456
  • sor = 1.23455 teklif = 1.23458 spread = 3 Ortalama fiyat: 1.23456
  • sor = 1.23455 teklif = 1.23459 spread = 4 Ortalama fiyat: 1.23457

Ve her şey basit görünüyor? her şey işe yaramalı ve ben kendim aptal mıyım? ve aptal olmadığımı umarak 2 gün oturdum. Yazılar, çiftler ve tribbles ve beebles hakkında anlayış .................

Ancak! aynı formülle, çift spreadler ve tek spreadler ile - bazı durumlarda - formül işe yaramadı. (yukarıyı görmek) .

Dahil olmak üzere, para birimleri üzerinde çalışabilir, ancak petrol üzerinde çalışamaz.

JPY üzerinde çalışabilir ve zamanın bir noktasında USD üzerinde çalışmayabilir.

Belki ayın etkisine bakıyor? afrika'da hava durumu ....................

Ancak formülün çalıştığından emin olduğunuzda bu 1 milipipi fark etmiyorsunuz. ve sen ..... üzerinde çalışıyorsun ve sonra "Bam, bam, bang, bam" ve bu milipunktik kaçmaya karar verdi ya da müdahale eden ikinci milipunktik'i aramaya karar verdi.

BENİM NACİZANE FİKRİME GÖRE.

Bana aptal, yetersiz programcı, okul çocuğu diyebilirsin...

Ama gerçek devam ediyor.

Farklı kombinasyonlarda - çift değerlerde bir hata var. Aynı zamanda, float ile her şey açıktır.

Niye ya? kendimi anlayana kadar. Yardım çok iyidir ve ben her zaman yardıma başvururum, bu normaldir. ve 10 yıl içinde topluluktan yardım isteyebilirim. Bu iyi. Ve bazı tuzaklar biliyorsam yardım çağrısına cevap veririm.Bu normaldir.

Tabii ki, bu tür testlerden sonra, bunun neden olduğunu kendim anlamak için "ek bir araştırma" yapacağım.

Sabrınız ve yardımlarınız için hepinize teşekkür ederim.

 
Vladislav Andruschenko :

Aslında, görev basit görünüyor? Ve bir öğrenci yapabilir mi? :-) Ben de öyle düşünmüştüm.

Ancak sunucudan alınan fiyatlarda, veri normalizasyonunda ve diğerlerinde - o kadar karanlık köşeler var ki, hiç bahsetmiyorum bile.

9 yıldır mql'de programlama yapıyorum - ve normalleştirme ile hiç problem yaşamadım çünkü doğru algıladım. ve 1 milinoktaya kadar doğruluk her zaman doğru çalıştı.

Ancak! aynı formülle, çift spreadler ve tek spreadler ile - bazı durumlarda - formül işe yaramadı. (yukarıyı görmek) .

Farklı kombinasyonlarda - çift değerlerde bir hata var. Aynı zamanda, float ile her şey açıktır.

Metaquotes'a göre veri normalleştirmesinin bununla ne ilgisi var? Programcılar için bu terim, tamamen farklı bir şey anlamına gelir, hiç yuvarlama değil. IEEE 754 standardını örneğin buradan okuyun: http://www.softelectro.ru/ieee754.html . Normalleştirilmemiş gerçek sayılar, 4 bayt uzunluk olması durumunda 1.17549421*10^(-38)'e kadar ve 8 bayt uzunluk olması durumunda 4....*10^(-324) aralığında yer alır, Onlarla çok nadiren karşılaşıyoruz ve zaten rotayı hesaplarken kesinlikle değil. OrderSend'i çağırmak ve ardından bu fonksiyonun gereksinimlerine göre yuvarlamak gerekli olacaktır. Görev gerektirmedikçe yuvarlama kullanmayın.

Hatalar double veya float formatında değil, kullanılan işlemlerde oluşur. Formülün sorunu çözmemesi, formülün soruna karşılık gelmediğini gösterir. Daha fazla yok. Normalleştirme olmadan normal bir hesaplama sırasında hangi hataların meydana geldiğini söyleyin (bu, yukarıdaki mesajımdan bir parça):

Spr= MathRound (( Sor - Bid )/ _Point ); Yay=Yay >> 1 ; Orta= Teklif + Yay*_ Puan ;

IEEE 754 - стандарт двоичной арифметики с плавающей точкой
  • Yashkardin Vladimir
  • www.softelectro.ru
double-precision длина числа, бит 32 64 смещенная экспонента (E), бит 8 11 остаток от мантиссы (M), бит 23 52 смещение 127 1023 двоичное денормализованое число (-1)S∙0,M∙exp2-127 ,где M-бинарное (-1)S∙0,M∙exp2-1023 ,где M-бинарное двоичное нормализованое число (-1)S∙1,M∙exp2(E-127) ,где M-бинарное (-1)S∙1,M∙exp2(E-1023) ,где M-бинарное...
 
Vladislav Andruschenko :

Aslında, görev basit görünüyor? Ve bir öğrenci yapabilir mi? :-) Ben de öyle düşünmüştüm.

Ancak sunucudan alınan fiyatlarda, veri normalizasyonunda ve diğerlerinde - o kadar karanlık köşeler var ki, hiç bahsetmiyorum bile.

9 yıldır mql'de programlama yapıyorum - ve normalleştirme ile hiç problem yaşamadım çünkü doğru algıladım. ve 1 milinoktaya kadar doğruluk her zaman doğru çalıştı.

Ama görevler var. yüksek hassasiyet gerektirir.

Ve şartlar var.

Yani:

  1. ASK ve BID fiyatlarını alıyoruz - ortalama fiyatını hesaplıyoruz = her şey basit mi? TAMAM.
  2. Buna göre, eğer spread tek ise (örneğin 3 puan), o zaman kalansız bölemeyiz, değil mi?

Bu nedenle, fiyatı normalleştirmemiz gerekiyor, böylece bir denge varsa (ve eşit bir dağılımla olacak! :-)), o zaman fiyatı en alt noktaya daha yakın bir şekilde ortalamalıyız, yani. açık arttırma.

Örneğin:

  • sor = 1.23455 teklif = 1.23457 spread = 2 Ortalama fiyat: 1.23456
  • sor = 1.23455 teklif = 1.23458 spread = 3 Ortalama fiyat: 1.23456
  • sor = 1.23455 teklif = 1.23459 spread = 4 Ortalama fiyat: 1.23457

Ve her şey basit görünüyor? her şey işe yaramalı ve ben kendim aptal mıyım? ve aptal olmadığımı umarak 2 gün oturdum. Yazılar, çiftler ve tribbleler ve beebles hakkında anlayış .................

Ancak! aynı formülle, çift spreadler ve tek spreadler ile - bazı durumlarda - formül işe yaramadı. (yukarıyı görmek) .

Dahil olmak üzere, para birimleri üzerinde çalışabilir, ancak petrol üzerinde çalışamaz.

JPY üzerinde çalışabilir ve zamanın bir noktasında USD üzerinde çalışmayabilir.

Belki ayın etkisine bakıyor? afrika'da hava durumu ....................

Ancak formülün çalıştığından emin olduğunuzda bu 1 milipipi fark etmiyorsunuz. ve sen ..... üzerinde çalışıyorsun ve sonra "Bam, bam, bang, bam" ve bu milipunktik kaçmaya karar verdi ya da müdahale eden ikinci milipunktik'i aramaya karar verdi.

BENİM NACİZANE FİKRİME GÖRE.

Beni bir aptal, bir yetersiz programcı, bir okul çocuğu olarak düşünebilirsin...

Ama gerçek devam ediyor.

Farklı kombinasyonlarda - çift değerlerde bir hata var. Aynı zamanda, float ile her şey açıktır.

Niye ya? kendimi anlayana kadar. Yardım çok iyidir ve ben her zaman yardıma başvururum, bu normaldir. ve 10 yıl içinde topluluktan yardım isteyebilirim. Bu iyi. Ve bazı tuzaklar biliyorsam yardım çağrısına cevap veririm.Bu normaldir.

Tabii ki, bu tür testlerden sonra, bunun neden olduğunu kendim anlamak için "ek bir araştırma" yapacağım.

Sabrınız ve yardımlarınız için hepinize teşekkür ederim.

Hedeflere bağlı olarak, bazen tam sayılara tamamen geçmeye değer. Çok fazla sinir kurtarıyor :-) Her nasılsa birçok, birçok seviyeyi doğru bir şekilde işaretlemenin gerekli olduğu bir görev vardı, önce double ile yoruldum ve sonra her şeyi 0'dan tam noktalara aktardım ve her şey kolay, basit ve hatasız.
Neden: