Hatalar, hatalar, sorular - sayfa 107

 
Yedelkin :
simpleton , ben de benzer bir yol izledim, ancak int yazmak için açık bir döküm kullandım. Mümkün olan maksimum lot büyüklüğünün ya komisyoncu/bayi tarafından ya da özkaynak büyüklüğü ile sınırlandırılacağı gerçeğinden yola çıktım. Bu bağlamda int kullanımı yeterli olacaktır. Bu yaklaşımla ilgili herhangi bir tuzak olduğunu düşünüyor musunuz ("aşağıdan" int ile yuvarlama)?

Gerçek ticaret için büyük olasılıkla - evet, int / uint yeterlidir.

Ancak test cihazına girerseniz, bazı deneyler için yeterli olmayabilir.

Formüldeki N tamsayısının 0..INT_MAX aralığına düştüğünü garanti ederseniz ve böylece taşma olmadığını garanti ederseniz, int kullanırken MQL5 uygulamasında olası sonraki hatalar dışında hiçbir tuzak yoktur. Yani, çeki değiştirin

tmp < ULONG_MAX * stepvol

üzerinde

tmp < INT_MAX * stepvol

Aslında, int türü işaretlidir, olası değerlerinin yarısı negatif sayılar bölgesinde bulunur ve burada her zaman negatif olmayanlar olacaktır. Aynı boyutta ancak negatif olmayan aralığın iki katı olan işaretsiz bir uint'iniz olduğunda int kullanmak mantıklı değildir. Bu nedenle, int / uint'te durursanız, sırasıyla uint'i seçmek ve kontrolü aşağıdakilerle değiştirmek daha iyidir:

tmp < UINT_MAX * stepvol
 

gumgum :

 #property script_show_inputs

Bahşiş için teşekkürler.
 
simpleton :

Gerçek ticaret için büyük olasılıkla - evet, int / uint yeterlidir.

..Aslında, int tipi işaretlidir, olası değerlerinin yarısı negatif sayılar bölgesinde bulunur ve burada her zaman negatif olmayanlar olacaktır. Aynı boyutta ancak negatif olmayan aralığın iki katı olan işaretsiz bir uint'iniz olduğunda int kullanmak mantıklı değildir. Bu nedenle, int / uint'te durursanız, sırasıyla uint'i seçmek ve kontrolü aşağıdakilerle değiştirmek daha iyidir:

Evet, anladım, teşekkürler!
 

Bu bir hata değil, türler hakkında ilginç bir gözlem uyarısıdır.

Kaçın iki katı olacağını düşünüyorsunuz, yani. 2*2

4 düşün belki haklısın!

tamam peki
iki yüz bin iki yüz bin

200000 * 200000

Evet, herhangi bir öğrenci ikiyi çarpar ve dört alır Evet, sıfırları toplayın ve

400000000000.

Ve şimdi makinenin dilinde basit bir kod

uzun partiler = 200000*200000;

değeri alan değişkenin türünün uzun olduğuna dikkat edin.
Minimum değer -9 223 372 036 854 775 808, maksimum değer 9 223 372 036 854 775 807'dir.

Sonucu yazdırıyoruz ve

lot = 1345294336
iki ve ikiden çok uzakta ve iki tane olacak.

Tipler ve tip döküm hakkında yardım bölümünü yeniden okudum.
Sıradan sayıların da açıkça istenen türe dönüştürülmesi gerektiğine dair hiçbir bilgi bulamadım.

yani doğru olmalı

uzun partiler = (uzun) 200000 * (uzun) 200000;

Alternatif olarak, yardımcı değişkenleri de kullanabilirsiniz.

Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Основы языка / Типы данных / Приведение типов - Документация по MQL5
 

Üstelik.

Bazı özellikleri büyük sayılarla almak ve çarpmak istiyorsanız ....

İşte kod

 long A = AccountInfoInteger ( ACCOUNT_LOGIN );   // 661701
long B = A;
long C = 661701 ;
Print ( " A=" ,A, "  B=" ,B, "  C=" ,C);
long X = 10000 ;

long L1 = A*X;
long L2 = B*X;
long L3 = C*X;

Print ( " L1=" ,L1, "   L2=" ,L2, "   L3=" ,L3);

Ve işte sonuç

L1= 2322042704    L2= 2322042704    L3= 6617010000
A = 661701         B = 661701       C = 661701
girdi aynı ama sonuç farklı
Dosyalar:
servis.mq5  2 kb
 

SHOOTER777 :

Ve şimdi makinenin dilinde basit bir kod

uzun partiler = 200000*200000;

değeri alan değişkenin türünün uzun olduğuna dikkat edin.
Minimum değer -9 223 372 036 854 775 808, maksimum değer 9 223 372 036 854 775 807'dir.

Sonucu yazdırıyoruz ve

lot = 1345294336
iki ve ikiden çok uzakta ve iki tane olacak.

Tipler ve tip döküm hakkında yardım bölümünü yeniden okudum.
Sıradan sayıların da açıkça istenen türe dönüştürülmesi gerektiğine dair hiçbir bilgi bulamadım.

yani doğru olmalı

uzun partiler = (uzun) 200000 * (uzun) 200000;

Alternatif olarak, yardımcı değişkenleri de kullanabilirsiniz.

"Normal sayılar", aynı zamanda bir türü olan sabit ifadelerdir. Bu durumda, tür int'dir.

Her biri int türünden iki alt ifadenin çarpımından oluşan bir ifade de int türündedir. Taşma burada gerçekleşir.

Ve ancak o zaman, long tipinde bir değişken başlatılırken, int tipinden long tipine örtük bir döküm yapılır.

Burada her şey temiz. Bu arada, bu durumda işlenenlerin her birini uzun türe dökmek gerekli değildir. Birini vermek yeterlidir, ikincisi ise dolaylı olarak verilecektir.

 
SHOOTER777 :

Üstelik.

Bazı özellikleri büyük sayılarla almak ve çarpmak istiyorsanız ....

İşte kod

Ve işte sonuç

girdi aynı ama sonuç farklı

Günlük ve kod karıştırılmış gibi görünüyor. Verilen kod "temiz" çalışır. Ve böyle bir günlük elde etmek için, int veya uint türünün A ve B değişkenlerini ve uint türünün X değişkenini yapmak zorunda kaldım :

 void OnStart ()
{
int A = 661701 ;
int B = A;
long C = 661701 ;
Print ( " A=" ,A, "  B=" ,B, "  C=" ,C);
uint X = 10000 ;

long L1 = A*X;
long L2 = B*X;
long L3 = C*X;

Print ( " L1=" ,L1, "   L2=" ,L2, "   L3=" ,L3);
}

/* Вывод в лог (хронология - сверху вниз):
KO      0       1 (EURUSD,M15)  00:46:28         A=661701  B=661701  C=661701
OE      0       1 (EURUSD,M15)  00:46:28         L1=2322042704   L2=2322042704   L3=6617010000
*/

Ve işte orijinal kodun çalışması:

 void OnStart ()
{
long A = 661701 ;
long B = A;
long C = 661701 ;
Print ( " A=" ,A, "  B=" ,B, "  C=" ,C);
long X = 10000 ;

long L1 = A*X;
long L2 = B*X;
long L3 = C*X;

Print ( " L1=" ,L1, "   L2=" ,L2, "   L3=" ,L3);
}

/* Вывод в лог (хронология сверху вниз):
DL      0       1 (EURUSD,M15)  00:49:13         A=661701  B=661701  C=661701
HG      0       1 (EURUSD,M15)  00:49:13         L1=6617010000   L2=6617010000   L3=6617010000
*/

314 oluşturun (20 Ağu 2010).

Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 

Söyle bana, örneğin, bir göstergenin değerini almanız gerekiyor. Önceden, tam olarak aldım ve yerleşik bir işlev kullanarak garanti ettim. Şimdi bir sürü kod kullanarak kendim yazmam, arabellekleri işlemem vb. Ancak! Bu durumda değil. Benim için asıl önemli olan, kodun her satırda kelimenin tam anlamıyla buggy olması, çünkü bunu her kod satırında bir hata olup olmadığını kontrol etmeniz gerekiyor ... Ve genel olarak, tüm bu zil ve ıslıkların, sınıfların ve temel olan ancak hızı, güvenilirliği vb. artırmak için zahmetli ve zahmetli hale gelen şey... 20 sinyalle ilgili bir makale okuyorum... şöyle diyor:

"Gösterge verilerine, oluşturulduktan hemen sonra erişemezsiniz, çünkü gösterge değerlerinin hesaplanması biraz zaman alır ve bu nedenle OnInit() içinde gösterge tanıtıcıları oluşturmak en iyisidir."

Ardından, her satır kontrol edilir

"Onları kontrol edelim: İhtiyacımız olandan daha az veri varsa, kopyalama sırasında bir hata oluştu ve verilerin saklanması gereken diziye daha fazla erişim bir hataya yol açacaktır. Bunu hariç tutmak için fonksiyondan çıkacağız. "

Yani, sonuç almak için hız yerine bir şey yapmalıyım, bu fonksiyon boyunca döngü (kaç kez?) ... Bu, her değer için ayrı bir işlevdir... Çok fazla değişken ve kod var...

Kısaca açıklayın, bir bağlantı verin, tüm bunların anlamını, bunun neden böyle olduğunu ve ne kadar güvenilir olduğunu anlamak istiyorum ...

Ve bu tür soruların cevaplarını referansın MKL4'ten MKL5'e geçiş bölümüne koymak veya forumda tartışmasız, özellikle bir soru-cevap ve neden böyle olduğunu açıklayan uygun bir bölüm oluşturmak güzel olurdu. ...mesela burada dönemle ilgili çok net bir şekilde anlatılmış, burada da aynı şekilde, temel sorulara cevap almak istiyorum.

 
Dmitriy2 :

Söyle bana, örneğin, bir göstergenin değerini almanız gerekiyor. Önceden, tam olarak aldım ve yerleşik bir işlev kullanarak garanti ettim. Şimdi bir sürü kod kullanarak kendim yazmam, arabellekleri işlemem vb. Ancak! Bu durumda değil. Benim için asıl önemli olan, kodun her satırda kelimenin tam anlamıyla buggy olması, çünkü bunu her kod satırında bir hata olup olmadığını kontrol etmeniz gerekiyor ... Ve genel olarak, tüm bu zil ve ıslıkların, sınıfların ve temel olan ancak hızı, güvenilirliği vb. artırmak için zahmetli ve zahmetli hale gelen şey... 20 sinyalle ilgili bir makale okuyorum... şöyle diyor:

"Gösterge verilerine, oluşturulduktan hemen sonra erişemezsiniz, çünkü gösterge değerlerinin hesaplanması biraz zaman alır ve bu nedenle OnInit() içinde gösterge tanıtıcıları oluşturmak en iyisidir."

Ardından, her satır kontrol edilir

"Onları kontrol edelim: İhtiyacımız olandan daha az veri varsa, kopyalama sırasında bir hata oluşmuş demektir ve verilerin saklanması gereken diziye daha fazla erişim, bir hataya yol açacaktır. Bunu ortadan kaldırmak için fonksiyondan çıkacağız. "

Yani eninde sonunda sonuca varmak için hız yerine bu fonksiyon üzerinden bir döngü (kaç kere?) yapmalıyım... Ve periyodik olarak farklı göstergelerin tek tek satırlarının ayrı değerlerine ihtiyacım olursa.. .Bu her değer için ayrı bir fonksiyondur... Çok fazla değişken ve kod var...

Kısaca açıklayın, bir bağlantı verin, tüm bunların anlamını, bunun neden böyle olduğunu ve ne kadar güvenilir olduğunu anlamak istiyorum ...

Ve bu tür soruların cevaplarını referansın MKL4'ten MKL5'e geçiş bölümüne koymak veya forumda tartışmasız, özellikle soru-cevap ve neden böyle olduğunu açıklayan uygun bir bölüm oluşturmak güzel olurdu. ...mesela burada dönemle ilgili çok net bir şekilde anlatılmış, bu şekilde aynı şekilde, temel sorulara cevap almak istiyorum

Daha güvenilir? Başlatma sırasında tanıtıcı almak neden güvenilir değil? Gerekli verileri kontrol etmek neden güvenilir değil? Ve dahası, çeklerin varlığı neden güvenilir değil?

Yeni başlayanlar için o kadar kolay olmayabilir, ancak zamanla her şey netleşecek ...

 
Interesting :

Daha güvenilir? Başlatma sırasında tanıtıcı almak neden güvenilir değil? Gerekli verileri kontrol etmek neden güvenilir değil? Ve dahası, neden çeklerin varlığı güvenilir değil?

Yeni başlayanlar için o kadar kolay olmayabilir, ancak zamanla her şey netleşecek ...

Bu makalenin yazarı olarak sizi tamamen destekliyorum. verileri kontrol etmek programın hızını bir bütün olarak kötüleştirmez, belki sadece% 0.01, böyle bir kontrol yapmadım, ancak verilerin kullanılmadan önce kontrol edilmesi gerektiği gerçeği sadece tümün kararlılığı içindir bir bütün olarak sistem, aksi takdirde terminal genel olarak çökene kadar öngörülemeyen sonuçlar olabilir.