![MQL5 - MetaTrader 5 müşteri terminalinde yerleşik ticaret stratejileri dili](https://c.mql5.com/i/registerlandings/logo-2.png)
Ticaret fırsatlarını kaçırıyorsunuz:
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Valla ben senden bunu beklemiyordum
Şüphelerimde yanıldığıma sevindim.
SK'ya
Sen daha iyi bilirsin. MQL'yi bir programlama dili olarak görmüyorum. Sadece böyle bir lehçe.
Bu arada, içinde zadolbali İKİ şey var:
1) işlem numaralandırması yoktur, yani mutlaka kaşlı ayraçlar
2) dönüş - parantez ihtiyacı ile çok can sıkıcı
Ama genel olarak - aferin çocuklar.
Kernighan ve Ritchie onları alkışlardı.
Sözlerimi geri alıyorum.
Şüphelerimde yanıldığıma sevindim.
Ve kavga etmedik :)
MQL'yi bir programlama dili olarak görmüyorum. Sadece böyle bir lehçe.
...
Ve mevcut durumda, 123.000000000000 değişkeninin hesaplamalarda kullanıldığı zamandaki başlangıç değeri 122.999999999999 olabilir. Ve bu, değişkenin keşfedilmesinden bu yana değerinin hiç değişmemesine, ancak program tarafından yalnızca diğer hesaplamalara katılması istenmesine rağmen.
Aslında, tüm yaygara bu yüzden. Bu nedenle NormalizeDouble () işlevini gerçek hesaplamaya mümkün olduğunca yakın, tercihen if, for, while ifadesinin koşulunda kullanmak gerekli hale geldi.
O zaman sana bir sorum var
1? sorun bir değişkeni depolamak veya okumaksa, döndürülen değer de hatırlanırsa veya bir hatayla okunursa NormalizeDouble() nasıl yardımcı olabilir?
2? neden NormalizeDouble(değer, basamak) şeması !OC! NormalizeDouble(değer, rakamlar) burada !OS! - karşılaştırma operatörü, her zaman çalışmıyor mu? doğrudan if içine yerleştirilmiş olsa bile?
3? NormalizeDouble() (fonksiyon algoritması) nasıl çalıştığını biliyor musunuz?
4? Bu konudaki fikrimi yazdım, siz ne düşünüyorsunuz?
yerçekimi001 yazdı:
...
Anahtar soru bu, değil mi? Ben kendim bunu uzun süre düşündüm: "bir duble girersin ve bir duble alırsın " . Ne değişebilir?
Tam cevabı bulamadım. Ama ben böyle hayal ediyorum
çift a = 2.00000000000000
çift b = 2.0000000000001
çift c = 1.999999999999
Tüm bu değişkenler farklıdır ve son karaktere (sayı) kadar bellekte saklanırlar!
Bu durumda işaretleri (sayıları) kendimiz belirleriz. Tanımlanmayan her şey sıfırlarla doldurulur.
Çift a = 2.0 olarak ayarlarsak ve bellekte zaten 2.00001 veya 1.9999999 olarak hatırlanırsa, o zaman NormalizeDouble()'nin o zaman yardımcı olmayacağı açıktır, çünkü zaten kesin olmayan bir değer döndürür!
Bir değişkenin değerini hatırlarken böyle bir hatanın neredeyse hiç olmadığını düşünüyorum. Ayrıca, 2.0 sayısının özellikle 1.9999999999999 olarak hatırlandığını düşünmüyorum, çünkü her karakter (rakam veya nokta) için belleğin bit dizisindeki belirli bir bit yanıtlanacaktır! Yani 2.0 sayısı güvenli bir şekilde 2.00000...00 olarak saklanır.
İşaretleri kendimiz tanımlamadığımız başka bir durum:
bir = 4.0;
b = 2.0;
c = a / b // - "bölme" işlemi işlemci veya daha doğrusu yardımcı işlemci tarafından gerçekleştirilir ve ayrıca değişkeni karakterlerle (sayılar) doldurur.
Ameliyattan sonra şunlara sahip olabilirsiniz:
Sıklıkla:
c = 2.000...0
c= 1.999999999...
c= 2000000001...
onlar. sonuç genellikle gerçek olandan az miktarda farklılık gösterir.
Büyük hatalar çok nadirdir:
c = 2.3
Burada iki açıklama var:
1) a veya b çağrıldığında bit dizisinin bir kısmı bellekte hasar gördü, yani. a ve b değişkenleri değişti.
2) "bölme" işlemi sırasında bir hata oluştu.
Sanırım en sık olan şey 2). Neden bilmiyorum. Bunun, yardımcı işlemcinin çalışmasını ihtiyacın zararına olacak şekilde optimize etmeye çalıştıklarından kaynaklandığını düşünüyorum.
2.000...00 sayısı ile c değişkeni karşılaştırıldığında eşitliğin sağlanmayacağı açıktır. Çünkü tüm bitler eşleşmeyecektir.
Şimdi, NormalizeDouble() yardım etmek için burada!
NormalizeDouble() bu küçük hatayı "düzeltecek"!
Hata genellikle çok küçük olduğundan, küçük bir kesinlikle yuvarlama her zaman doğru sonucu verecektir.
Bunun gibi görünecek:
a = 2.111...11 sayısını ikinci ondalık basamağa yuvarlayalım.
Bunu yapmak için, NormalizeDouble() önce yeni değişkene 2.11 yazar ve kalan bitleri birler değil sıfırlarla doldurur!
Sanırım şöyle görünecek:
Burada, neden NormalizeDouble() gerekli olduğunu elimden geldiğince açıklamaya çalıştım.
Yakın zamana kadar bu açıklama bana tamamen uyuyordu. Ancak son zamanlarda kendim böyle bir planın her zaman işe yaramayacağına ikna oldum.
Bu nedenle, makul ve anlaşılır herhangi bir eleştiriden memnuniyet duyacağım!
...
Ve mevcut durumda, 123.000000000000 değişkeninin hesaplamalarda kullanıldığı zamandaki başlangıç değeri 122.999999999999 olabilir. Ve bu, değişkenin keşfedilmesinden bu yana değerinin hiç değişmemesine, ancak program tarafından yalnızca diğer hesaplamalara katılması istenmesine rağmen.
Aslında, tüm yaygara bu yüzden. Bu nedenle NormalizeDouble () işlevini gerçek hesaplamaya mümkün olduğunca yakın, tercihen if, for, while ifadesinin koşulunda kullanmak gerekli hale geldi.
Emin. Bilginin kaynağı, MQL4'te kendi programlama deneyimim ve geliştiricilerin danışmanlığıdır.
NormalizeDouble(), karşılaştırma işleminden hemen önce kullanılmalıdır. Karşılaştırma işleminin sonucu, hiçbir zaman bozulmayan boole türünde bir değerdir.
Bunu söylemedim. Bu tam olarak böyle çalışır ve böyle yapılmalıdır.
Hayır bilmiyorum. Bununla geliştiricilere.
Fikriniz ilginç, ancak bu sorun uzun zamandır çözüldü. Tekerleği yeniden icat etmemek ve geliştiricilerin tavsiyelerini kullanmak daha iyidir.
Bunu söylemedim. Bu tam olarak böyle çalışır ve böyle yapılmalıdır.
'Ve yine iki çift karşılaştırma hakkında' , ilk gönderiden 1 sayfa!
ne yazık ki NormalizeDouble(xy,Digits) yapısı NormalizeDouble(x,Digits) - NormalizeDouble(y,Digits) yapısıyla aynı değil
Ve aynı olması gerekmez. Önce düzelt.
bence tasarım
if (NormalizeDouble(x,Digits) - NormalizeDouble(y,Digits) != 0)
Ve tasarım
if (NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
aynısı!
Sen ne diyorsun?
Ve aynı olması gerekmez. Önce düzelt.
bence tasarım
if ( NormalizeDouble (x,Digits) - NormalizeDouble(y,Digits) != 0)
Ve tasarım
if (NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
aynısı!
Sen ne diyorsun?
Peki ya Renat'ın görüşü..? ilgilenmiyorum??? MT geliştirme şirketinin genel müdürünün görüşüyle ilgilenmiyor musunuz?
Yoksa A.S.'deki o yaşlı kadın gibi misin? Puşkin mi? Sadece istiyorum, istiyorum, istiyorum! Peri masalının nasıl bittiğini hatırla. "Balık bir şey söylemedi. Kuyruğunu salladı ve masmavi denize yüzdü. Uzun süre denizde bir cevap bekledi. Beklemedi, yaşlı kadına döndü.."
Ve aynı olması gerekmez. Önce düzelt.
bence tasarım
if ( NormalizeDouble (x,Digits) - NormalizeDouble(y,Digits) != 0)
Ve tasarım
if (NormalizeDouble(x,Digits) != NormalizeDouble(y,Digits))
aynısı!
Sen ne diyorsun?
Peki ya Renat'ın görüşü..? ilgilenmiyorum??? MT geliştirme şirketinin genel müdürünün görüşüyle ilgilenmiyor musunuz?
Yoksa A.S.'deki o yaşlı kadın gibi misin? Puşkin mi? Sadece istiyorum, istiyorum, istiyorum! Peri masalının nasıl bittiğini hatırla. "Balık bir şey söylemedi. Kuyruğunu salladı ve masmavi denize yüzdü. Uzun bir süre denizde cevap bekledi. Beklemedi, yaşlı kadına döndü.."
Yani Renat birinci seçeneğin doğru, ikinci seçeneğin yanlış olduğunu söyledi ve siz ikinci seçeneğin de doğru olduğunu söylediniz, değil mi?
Bunu söylemedim. Bu tam olarak böyle çalışır ve böyle yapılmalıdır.
Bunu daha fazla-daha az karşılaştırmasını ima ederek söyledim:
formun yapılarının her zaman işe yaramadığını akılda tutarak:
onlar. NormalizeDouble (), karşılaştırma işleminin değerlendirildiği yere mümkün olduğunca yakın olarak doğrudan operatör başlığına eklenmelidir.
Geliştiricilerin görüşüne gelince, bu görüşe meydan okumak niyetinde değilim.
Ve sonra .. o iş parçacığında tamamen farklı bir tasarımla ilgiliydi:
Bunu daha fazla-daha az karşılaştırmasını ima ederek söyledim:
Bu yapıyı kullandığımda karşılaştırma hataları yaşadım:
Neden bilmiyorsun?