MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 19
![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
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 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);
}
}
{
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 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 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 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 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 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
{
Koef[p]=Edxdy[n- 1 ][p]/ sqrt (Edx2[n- 1 ][p]*Edy2[n- 1 ][p]);
Buffer1[p]=Koef[p];
}
________________________________________________________________________________________
![](https://c.mql5.com/3/110/1__7.png)
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
#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;
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.
int i ve int p'yi bir kez bildirmek yeterlidir - hatta init()'den önce
"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.
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.
Bu durumda gereğinden fazla 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.
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.
...
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.