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

 

Merhaba.

Lütfen çözmeme yardım et. Basit bir dizinin çalışmasını kontrol ederken (bir değer atadım);

a[0][2]=91.49999999993754;

Yazdır ("a[0][2]=",a[0][2]);

H= 1/(1+exp(-a[0][2]));

a[0][2]=H;

Print(" 1/(1+exp(-a[0][2]))=",1/(1+exp(-a[0][2])) " H=",H," a [0][2]=",a[0][2]);


sonucu alıyorum:

2019.09.21 13:21:44.328 2011.01.03 14:54:20 W EURUSD,H4: a[0][2]=91.49999999993754

2019.09.21 13:21:44.328 2011.01.03 14:54:18 W EURUSD,H4: 1/(1+exp(-a[0][2]))=0.7310585786300049 H=1.0 a[0][2]=1.0

Nasıl yani?

 
im-zvv :

Merhaba.

Lütfen çözmeme yardım et. Basit bir dizinin çalışmasını kontrol ederken (bir değer atadım);

a[0][2]=91.49999999993754;

Print("a[0][2]=",a[0][2]);

H= 1/(1+exp(-a[0][2]));

a[0][2]=H;

Print(" 1/(1+exp(-a[0][2]))=",1/(1+exp(-a[0][2])) " H=",H," a [0][2]=",a[0][2]);


sonucu alıyorum:

2019.09.21 13:21:44.328 2011.01.03 14:54:20 W EURUSD,H4: a[0][2]=91.49999999993754

2019.09.21 13:21:44.328 2011.01.03 14:54:18 W EURUSD,H4: 1/(1+exp(-a[0][2]))=0.7310585786300049 H=1.0 a[0][2]=1.0

Nasıl yani?

Çoğaltılması zor bir örneğiniz var, ancak size yapılan tür nedeniyle beklediğiniz şeyi alamadığından şüpheleniyorum.

bu kodla deneme yapın:

 void OnStart ()
{
   double a;
   int b = 2 ;
   a = b / 5 ;     //    a = 0.0
   Print ( "a = " ,a);  
}

sonra bunlarla:

 void OnStart ()
{
   double a;
   int b = 2 ;
   a = b /( double ) 5 ;     //    a = 0.4
   Print ( "a = " ,a);  
}

ve

 void OnStart ()
{
   double a;
   int b = 2 ;
   a = b / 5.0 ;     //  a = 0.4
   Print ( "a = " ,a);  
}

ve "gerçek sayılar" forumunda arama yapmak, kısacası, "C" tipi döküm ilk bakışta şaşırtıcıdır;)

 

int değişkenlerini kullanarak bir sürü örnek gösterdiniz.

Tüm çift değişkenlerim var.

Yani değişkenleri aynı formata getirmek işe yaramaz.

 
im-zvv :

int değişkenlerini kullanarak bir sürü örnek gösterdiniz.

Tüm çift değişkenlerim var.

Yani değişkenleri aynı formata getirmek işe yaramaz.

a[0][2]=91.49999999993754;

Print("a[0][2]=",a[0][2]);

H= 1 /( 1 +exp(-a[0][2]));

a[0][2]=H;

Print(" 1/(1+exp(-a[0][2]))=",1/(1+exp(-a[0][2])) " H=",H," a [0][2]=",a[0][2]);


sonucu alıyorum:

2019.09.21 13:21:44.328 2011.01.03 14:54:20 W EURUSD,H4: a[0][2]=91.49999999993754

2019.09.21 13:21:44.328 2011.01.03 14:54:18 W EURUSD,H4: 1/(1+exp(-a[0][2]))=0.7310585786300049 H=1.0 a[0][2]=1.0

Nasıl yani?

tamsayı sabitleriniz var ve örneğin kendisi tekrarlanabilir değil - hiçbir değişken türü yoktur ve genel olarak - "bir grup örneğim" bir PC olmadan hesaplanabilir, örneğiniz ... peki, bana nasıl olduğunu önceden söyleyin çok e^(-91.49999)

tamam gidelim sana yardım edemem

 

Üzgünüm... "Yardım edemem"...

Bu ne kadar e^(-91.49999) olacağı ile ilgili değil. Soru, neden double = H türündeki bir değişkene yanlış yazıldığıdır.

önceden hesaplanan tür sayısı double = 0.7310585786300049 ve 1.0 yazılır (bu arada double).

Kodumu test cihazında çalıştırma zahmetine girerseniz, sanırım MT4'ünüz de aynısını verecektir.

Eğer öyleyse, MQL4 iş için kullanılamaz ve tehlikelidir!

 
im-zvv :

Üzgünüm... "Yardım edemem"...

Yardım ettim, yardım benim için yap ya da zaten okumayacağım anlamına gelmez, ama sonuç benim için önemli!

im-zvv :

Eğer öyleyse, MQL4 iş için kullanılamaz ve tehlikelidir!

MQL4 / MQL5 matematiksel ifadeleri hesaplarken davranış C ++ ile tamamen örtüşüyor, sorunuzla herhangi bir C ++ forumuna başvurabilirsiniz, belki varlık orada yardımcı olabilir

Peki, yardım / açıklama / öğretme alanından sorunuz, MT platformunun tartışma alanına taşındı, beğenmediyseniz kullanmayın, ücretsiz mi aldınız?

... eski zamanlarda, fiziksel süreçlerin yanlış anlaşılması insanlarda panik korkusuna neden oldu, sonra gök gürledi, sonra bir deprem ... önce paniğe ve spekülasyona neden oldu, sonra din ortaya çıktı)))

 

Bu kadar sinirlenmemeliydin.

Kişisel duygularınızı incittiysem, içtenlikle özür dilerim.

MT4'ü kesinlikle tartışmıyorum ve kınamıyorum. sadece koşmayı önerdim

MT4 test cihazında gönderdiğim kod ve tüm değişkenlerin (H, a[0][2] ) olması şartıyla

double olarak tanımlandı ve sonuç benimkiyle aynı, o zaman bir sorum var:

sorun ne? sana hitap ettim.

Bir kez daha: Yazık ki... "Yardım edemem"...

Herşey gönlünce olsun.

 
im-zvv :

tüm değişkenler (H, a[0][2] )

çift olarak tanımlandı

Bir kez daha tekrar ediyorum - matematiksel bir ifadede sabitleriniz var mı? - benim örneğimde de sabit 5 var... sonra 5.0 yazdım - derleyici için aynı değil! ve sonra derleyici için double ---> yazmak için tamsayı sabiti 5'i açıkça kullandım, bu 5.0'ın üzerindeki örnekle aynı olacaktır.


Sorunuz forumda düzenli olarak tekrarlanıyor, ancak belki de sorunuzun ne olduğunu anlamıyorum - "ağır bir formülünüz" ve açık olmayan değişkenleriniz var - gereksizleri örneklerden kaldırın - diziler ve üs - o zaman sorunun ne olduğu konusunda net olun, ancak tüm gereksizleri kaldırırsanız , büyük olasılıkla beklediğinizi almadığınız yeri kendiniz bulacaksınız - genellikle bende böyle;)


Not: ve eksi 91.49'un kuvvetinin üssü çok küçük bir sayı değil mi? çift tip daha fazla hassasiyete sahip, ancak yüzüncü derecede, evet ve eksi işaretini hesaba katarsak - bence bu ifade kesinliğini kaybedecek, google'a gitmek istemiyorum, ama ilk çevirdiğim şey Wiki oldu

 

Sabrınız için teşekkürler!

Bu şekilde denedim:

A=91.49999999993754;//a[0][2]=91.49999999993754;

Yazdır ("A=",A);

H= 1/(1+exp(-A));

//A=H;

Print(" 1/(1+exp(-A))=",1/(1+exp(-A)) " H=",H," a[0][2]=",a[0 [2]);

Sonuç:

2019.09.21 16:14:17.691 2011.01.04 22:29:51 EURUSD,H4: A=91.49999999993754

2019.09.21 16:14:17.690 2011.01.04 22:29:50 W EURUSD,H4: 1/(1+exp(-A))=1.0 H=1.0 a[0][2]=0.0

!!!!! Bu 1/(1+exp(-91.49999999993754))=1.0 olduğunu gösterir ve A=H kodundaki gibi bırakılırsa Yazdır komutunda hesaplama devam eder (

Neden 1/(1+exp(-91.49999999993754))=1.0 'ı anlayacağım.

Lütfen beni Anla. Şimdi bir sinir ağı kurmak ve eğitmekle meşgulüm. kodun kendisi ham ve ben bile kafam karıştı ... :)

Ağın hataları tekrarladığını fark ettim. Ve sigmoidin hesaplanmasındaki ana hata. =1 OLMAMALIDIR.


 
im-zvv :

Sabrınız için teşekkürler!

Bu şekilde denedim:

A=91.49999999993754;//a[0][2]=91.49999999993754;

Yazdır("A=",A);

H= 1/(1+exp(-A));

//A=H;

Print(" 1/(1+exp(-A))=",1/(1+exp(-A)) " H=",H," a[0][2]=",a[0 [2]);

Sonuç:

2019.09.21 16:14:17.691 2011.01.04 22:29:51 EURUSD,H4: A=91.49999999993754

2019.09.21 16:14:17.690 2011.01.04 22:29:50 W EURUSD,H4: 1/(1+exp(-A))=1.0 H=1.0 a[0][2]=0.0

!!!!! Bu 1/(1+exp(-91.49999999993754))=1.0 olduğunu gösterir ve A=H kodundaki gibi bırakılırsa Yazdır komutunda hesaplama devam eder (

Neden 1/(1+exp(-91.49999999993754))=1.0 'ı anlayacağım.

Lütfen beni Anla. Şimdi bir sinir ağı kurmak ve eğitmekle meşgulüm. kodun kendisi ham ve ben bile kafam karıştı ... :)

Ağın hataları tekrarladığını fark ettim. Ve sigmoidin hesaplanmasındaki ana hata. =1 OLMAMALIDIR.


bu yüzden hiçbir şey bulamayacaksınız, bu yüzden kontrol etmeye karar verdim, koddaki hatanın veya yanlışlığın nerede olduğunu aramanız gerekiyor:

 void OnStart ()
  {
       double a= 91.49999999993754 ;
       Print ( "1. a = " ,a);
       double H= 1 /( 1 + exp (-a));
      a=H;
       Print ( "2. a = " ,a);
       Print ( "3. H = " ,H);
       double e = exp (- 91.49999999993754 );
       Print ( "4. e = " ,e);
  }

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 4.e = 1.828331349163451e-40

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 3. H = 1.0

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 2. a = 1.0

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 1. a = 91.49999999993754

ve sonra adım adım hesaplayın ve sonuçları yazdırın, ancak bence 4. adımda doğruluk zaten düşecek, sonucu benim için görebilirsiniz: 1.82 x 10 ^ (-40) - bu çok küçük bir sayı ve herhangi biri gelecekte bu kadar küçük sayılarla yapılan işlemler hassasiyeti kaybetmek için daha da fazla olacaktır, bu, tabiri caizse, gerçek sayılarla çalışırken "sihir"dir - bu kadar küçük sayılarla hassasiyeti kaybetmemek için hesaplamalar yapmaya çalışmanız gerekir. tamsayı veya çift olarak, ancak sayının mantisini kaybetmeden - 10^40 ile çarpmanız gerekir .. .- burada genel olarak düşünmeniz gerekir, bu yüzden yarasadan size yardım etmeyeceğim
Neden: