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

 
Andrey F. Zelinsky :

Bu hatayı düzeltmek için - formülünüzü anlamanız gerekir - ne, neden ve nasıl düşündüğünüzü.

Ve ancak o zaman algoritmanız üzerinde yineleme yapmak ve sınır dışı diziyi ortadan kaldırmak mümkün olacaktır.

"Dürtme" yöntemini kullanmak ve formülün yanlış anlaşılması - hatayı ortadan kaldıracaksınız, ancak hesaplamayı yanlış yapacaksınız.

ps Neyi ve neden düşündüğünüzü ayrıntılı olarak açıklayın - kodunuzu ayrıntılı olarak yorumlayabilirsiniz - ve sonra bu hatayı nasıl düzelteceğimizi anlayacağız.


Kapanış fiyatlarında Pearson korelasyon katsayısının değerleri üzerine kurulmuş bir göstergeye ihtiyacımız var. İlk çubuktan başlayarak 2 para birimi için 24 çubuk dizisi alıyoruz (benim durumumda bu n değişkenidir). 24 çubuk için korelasyonu hesaplayalım - ilk çubuktaki değeri alacağız. Ardından 24 bar için korelasyonu hesaplıyoruz, ancak ikinciden başlayarak vb.
1. Fiyatları kapatarak (i elemanları ve p boyutları) iki boyutlu bir dizi aldım.
for ( int i= 1 ; i<n; i++)
      {
       for ( int p= 0 ; p<m; p++)
         {
         Price_CloseX[i][p]= iClose (sym_x, PERIOD_H1 , i+p);
         Price_CloseY[i][p]= iClose (sym_y, PERIOD_H1 , i+p);
        
         }
      }
2. Şimdi her dizideki kapanış fiyatlarının toplamını sayıyorum
for ( int i= 1 ; i<n; i++)
      {    
       for ( int p= 0 ; p<m; p++)
         {  
         sum_x[i][p]=sum_x[i][p- 1 ]+Price_CloseX[i][p];                                        
         sum_y[i][p]=sum_y[i][p- 1 ]+Price_CloseY[i][p];
        
         }        
      }

3. Her dizideki 24 bar (n-1) için ortalama kapanış fiyatı

for ( int i= 1 ; i<n; i++)
      {    
       for ( int p= 0 ; p<m; p++)
         {      
         Mx[i][p]=sum_x[p+ 1 ][m- 1 ]/(n- 1 );  
         My[i][p]=sum_y[p+ 1 ][m- 1 ]/(n- 1 );
                
         }
       }

4. Her dizideki ortalama fiyattan sapma

for ( int i= 1 ; i<n; i++)
      {
       for ( int p= 0 ; p<m; p++)
         {
         dx[i][p]=Price_CloseX[i][p]-Mx[i][p];
         dy[i][p]=Price_CloseY[i][p]-My[i][p];
         }
      }

5. Ortalama kapanış fiyatından kare sapma

for ( int i= 1 ; i<n; i++)                                                                  
      {
       for ( int p= 0 ; p<m; p++)
         {
         dx2[i][p]=(dx[i][p]*dx[i][p]);
         dy2[i][p]=(dy[i][p]*dy[i][p]);
        
         }
      }

6. Sapmaların çarpımı, yani 1 para birimi dizisinin her bir elemanı, benzer bir 2 para birimi ile çarpılır,
örneğin, dx[1][0](currency 1) değeri dy[1][0](currency 2) ile çarpılır; dx[3][4]*dy[3][4], vb.

for ( int i= 1 ; i<n; i++)                                                                  
      {
       for ( int p= 0 ; p<m; p++)
         {
         dxdy[i][p]=(dx[i][p]*dy[i][p]);
        
         }
      }  

7. Kare sapmaların toplamını ve sapmaların çarpımının toplamını dikkate alıyoruz

for ( int i= 1 ; i<n; i++)                                                                  
      {
       for ( int p= 0 ; p<m; p++)
         {
         Edx2[i][p]=(Edx2[i- 1 ][p]+dx2[i][p]);                                        
         Edy2[i][p]=(Edy2[i- 1 ][p]+dy2[i][p]);
         Edxdy[i][p]=(Edxdy[i- 1 ][p]+dxdy[i][p]);
         }
      }

8. Aslında, korelasyon katsayısını arabellekte değiştiriyoruz

for ( int p= 0 ; p<m; p++)
         {
         Koef[p]=Edxdy[n- 1 ][p]/ sqrt (Edx2[n- 1 ][p]*Edy2[n- 1 ][p]);
         Buffer1[p]=Koef[p];
         }

________________________________________________________________________________________
Yukarıda yazıldığı gibi, hata sınırların dışında bir dizidir. Korelasyon katsayısını hesaplamak için benzer bir koda sahip bir komut dosyası bu katsayıyı hesaplar

 
Timur1988 :
#property strict yazıldığında, derleyici her for() döngüsünde değişkenlerin bir türü olması gerektiğine dair hatalar verdi ve bu nedenle her döngüde int i ve int p yazılması gerekiyordu. Bundan sonra derleyici herhangi bir hata vermedi, ancak hat oluşturulmadı. #property strict öğesini kaldırdığımda, derleyicinin artık her döngüde türü bildirmesi gerekmiyordu ve satır oluşturuldu.

int i ve int p'yi bir kez bildirmek yeterlidir - hatta init()'den önce

double Buffer1[]'den önce böyle bir satır yazabilirsiniz;

int i,p;

koddaki int'yi kaldır

#property katının geri döndürülmesi gerekiyor

sonra tekrar derlemeye başlayın

daha sonra çalışırken hataları arayın

daha sonra dizinin sınırlarının dışına çıkılması durumunda hangi kod satırına bakarız (sayı satırın kendisini de ilgilendiriyor). Daha önce, 90 numaralı satırınız vardı

Hata, dizide 24 değeriniz varsa ve 24. dizini talep ederseniz, o zaman ... bu bir hatadır. Anlamaya çalışın. Dizin numaralandırma sıfırdan başlar, yani. sizin durumunuzda 0,1,...23.

Anlayamazsak bu satırı buraya atarız, düşünürüz.

 
Renat Akhtyamov :

int i ve int p'yi bir kez bildirmek yeterlidir - hatta init()'den önce

"Cehenneme programlamanın yolu küresel değişkenlerle döşenmiştir." S. McConnell.
 
Alexey Kozitsyn :
"Cehenneme programlamaya giden yol küresel değişkenlerle döşenmiştir." S. McConnell.
Bazen onlarsız daha zor, ancak tartışılan gösterge durumunda değil.
 
Artyom Trishkin :
Bazen onlarsız daha zor, ancak tartışılan gösterge durumunda değil.
Katılıyorum, bazen onlarsız yapamazsınız. Lakin bu durumda değil.
 
Alexey Kozitsyn :
Katılıyorum, bazen onlarsız yapamazsınız. Lakin bu durumda değil.

Bu durumda gereğinden fazla ve fazlasıyla kod yazılır.

Bu arada, değişkenin adı aynı olsa bile her değişkenden önce bir tür de yazabilirsiniz ...., ancak bu kodun doğru yapısı değil.

 
Renat Akhtyamov :
Bu durumda gereğinden fazla kod yazılır.
Sayfada yer kalmadığından emin olun...
 
Renat Akhtyamov :

Bu arada, değişkenin adı aynı olsa bile her değişkenden önce bir tür de yazabilirsiniz ...., ancak bu kodun doğru yapısı değil.

Aslında benim yaptığım bu, muhtemelen bunu yapmanız tavsiye edilmemeliydi ama belki bazı sorunlarla karşılaştığınızda kararınızı tekrar gözden geçirirsiniz.
 
Alexey Kozitsyn :
Aslında benim yaptığım bu, muhtemelen bunu yapmanız tavsiye edilmemeliydi ama belki bazı sorunlarla karşılaştığınızda kararınızı tekrar gözden geçirirsiniz.
for ( int i= 1 ; int i< int n; int i++)                                                                  
...
Böyle??? Lütfen.
 
Renat Akhtyamov :

Bu durumda gereğinden fazla ve fazlasıyla kod yazılır.

Bu arada, değişkenin adı aynı olsa bile her değişkenden önce bir tür de yazabilirsiniz ...., ancak bu kodun doğru yapısı değil.

Her değişkenin kendi kapsamı vardır. Kıvrımlı parantezlerin içinde bile - bu kapsamda bildirilen bir değişken için kendi kapsamı - kaşlı ayraçların içinde. Öyleyse, örneğin, kesişmediklerini biliyorsam ve "i" gibi bir değişkenin adını kullanmak yeterli ve alışılmışsa, neden programın farklı yerlerinde farklı isimlerle döngü indeksi değişkenleri üreteyim?