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

 

1. Bir sorum var, bir dizi elemanını bellekten nasıl silebilirim, diziyi matematiksel olarak bir döngü üzerinden kaydırarak bir elemanı sildiğim anda, mql4'te mümkün mü? Mümkünse, lütfen bunun tek boyutlu bir dizide nasıl yapıldığına dair bir örnek verin.

2. Ayrıca, bellekten silerseniz, gereksiz öğeler içeren bir bölümü keserseniz, dizinin küçüleceği ve sayısının değeri kadar azalacağı dikkate alındığında, hangi yöntemin daha yüksek performanslı olacağı sorusudur. silinen öğeler ve dizinin sonraki kullanımında diziyi orijinal durumuna geri yüklemeniz gerekecek; bir döngüden matematiksel bir şekilde silerseniz, döngü, değişkenlere değer atamak için sabit hesaplamaların olduğu işlenir ve bu da programa yük getirir?

 
Seric29 :

1. Bir sorum var, bir dizi elemanını bellekten nasıl silebilirim, diziyi matematiksel olarak bir döngü üzerinden kaydırarak bir elemanı sildiğim anda, mql4'te mümkün mü? Mümkünse, lütfen bunun tek boyutlu bir dizide nasıl yapıldığına dair bir örnek verin.

2. Ayrıca, bellekten silerseniz, gereksiz öğeler içeren bir bölümü keserseniz, dizinin küçüleceği ve sayısının değeri kadar azalacağı dikkate alındığında, hangi yöntemin daha yüksek performanslı olacağı sorusudur. silinen öğeler ve dizinin sonraki kullanımında diziyi orijinal durumuna geri yüklemeniz gerekecek; bir döngüden matematiksel bir şekilde silerseniz, döngü, değişkenlere değer atamak için sabit hesaplamaların olduğu işlenir ve bu da programa yük getirir?

Diziyi "kendisine" kopyalamak ve dizinin boyutunu gereksiz öğelerin sayısı kadar azaltmak yeterlidir.

Bir eleman eklemek için, boyutu büyütmek, tekrar "kendine" kopyalamak ve istenen değeri boş alana yapıştırmak yeterlidir.

 
Alexey Viktorov :

Diziyi "kendisine" kopyalamak ve dizinin boyutunu gereksiz öğelerin sayısı kadar azaltmak yeterlidir.

Bir eleman eklemek için, boyutu büyütmek, tekrar "kendine" kopyalamak ve istenen değeri boş alana yapıştırmak yeterlidir.

Kopyalama işlevine 3 boyutlu bir dizi eklemeye çalıştım, hata yok, bu, bu işlevin farklı boyutlardaki dizilerle çalışabileceği veya yalnızca farklı boyutlar için kopyaları olabileceği anlamına geliyor. Bu arada shift fonksiyonu yerine bu fonksiyon kullanılabilir, kendin yazmana gerek yok yazık ki daha önce aklıma gelmemişti, bir diziyi kendi içine kopyalamak ne kadar riskli, yazılmış. sonucun tanımlanamayacağı anlamına gelir.

 
Seric29 :

Kopyalama işlevine 3 boyutlu bir dizi eklemeye çalıştım, hata yok, bu, bu işlevin farklı boyutlardaki dizilerle çalışabileceği veya yalnızca farklı boyutlar için kopyaları olabileceği anlamına geliyor. Bu arada shift fonksiyonu yerine bu fonksiyon kullanılabilir, kendin yazmana gerek yok yazık ki daha önce aklıma gelmemişti, bir diziyi kendi içine kopyalamak ne kadar riskli, yazılmış. sonucun tanımlanamayacağı anlamına gelir.

Çok boyutlu bir diziyi kopyalarken, ikinci ve sonraki boyutların boyutu dikkate alınmalıdır. Kopyalarken ne kadar kaydırmanız gerektiğine bağlıdır. Basitçe söylemek gerekirse, deneyler sırasında anladığım gibi, çok boyutlu bir dizinin tüm değerleri "bir satırda" sıralanır ve sonra tekrar bir "sütun" içinde oluşturulurlar.

Genel olarak, şimdi teoriyi tekrar anlatamam. Bunu kullanmak için bir ihtiyaç olup olmadığını tekrar kontrol etmek gerekli olacaktır.

 
Alexey Viktorov :

Çok boyutlu bir diziyi kopyalarken, ikinci ve sonraki boyutların boyutu dikkate alınmalıdır. Kopyalarken ne kadar kaydırmanız gerektiğine bağlıdır. Basitçe söylemek gerekirse, deneyler sırasında anladığım gibi, çok boyutlu bir dizinin tüm değerleri "bir satırda" sıralanır ve sonra tekrar bir "sütun" içinde oluşturulurlar.

Genel olarak, şimdi teoriyi yeniden anlatamam. Bunu kullanmak için bir ihtiyaç olup olmadığını tekrar kontrol etmek gerekli olacaktır.

C++'da bunun arasında bir fark yoktur.

   вывести в консоль massiv[ 0 ][ 0 ][ 0 ]
   или так
   вывести в консоль massiv[ 0 ]

bu durumlardan herhangi birinde bir çıktı olacaktır. Aynı bellek bloğunda yer aldıkları ve C++ onlara doğrudan eriştiği için ve kabuğumuzda belleğe erişim kapalı olduğundan ve farklı boyutlardaki dizileri işleve doğru bir şekilde geçirmenin ve bu şekilde onlara erişmenin bir yolu yoktur, tek uyarı C++'daki çok boyutlu dizilerin dinamik bellekte yer alması, hatta hiç kimsenin konumun elektronik haritasını görmemesine rağmen dağılmış durumda olmasıdır. Yani konsepte göre çok boyutlu dizileri kendi içine kopyalamak çok hassas bir konu mu yoksa düzgün çalışmayabilir mi?

 
Hesaba nasıl giriş yaptığınızı programlı olarak nasıl belirleyebilirsiniz: bir yatırım şifresi veya bir ticaret şifresi kullanarak?
 

Göstergem MQL5 kodunu yürütmüyor

 void KValues( int i)
  {
   vhigh = 0 ; vlow = High[i];
   int limit = i + ( int )kperiod;
   for ( int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a]) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a]) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a]) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a]) : vlow);
     };
  }

Sonuç olarak, fiyat == STO_LOWHIGH ise her şey düzgün çalışır ve fiyat == STO_CLOSECLOSE ise işlev yalnızca

vhigh = 0 ; vlow = High[i];

... döngüyü atlayarak

 
Alexandr Sokolov :

Göstergem MQL5 kodunu yürütmüyor

Sonuç olarak, fiyat == STO_LOWHIGH ise her şey düzgün çalışır ve fiyat == STO_CLOSECLOSE ise işlev yalnızca

... döngüyü atlayarak

Parantezlerde bir sorun var. Benim düşünceme göre, burada onlara hiç ihtiyaç yok. Hepsi gerekli değildir.

Veya en azından soldaki soru işaretinden önce seçilenleri yeniden düzenleyin.

 void KValues( int i)
  {
   vhigh = 0 ; vlow = High[i];
   int limit = i + ( int )kperiod;
   for ( int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a] ) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a] ) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a] ) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a] ) : vlow);
     };
  }

Genel olarak, ?: operatörünün if else ile eşdeğer olduğunu anlamanız yeterlidir.

Bir koşulu iki kez alırsınız. Bu durum yeterli

vhigh = price == STO_LOWHIGH ? High[a] : Close[a];
vlow  = price == STO_LOWHIGH ? Low[a] : Close[a];
Ya da almak istediğiniz bir şeyi anlamadım.
 
Alexey Viktorov :

Parantezlerde bir sorun var. Benim düşünceme göre, burada hiç gerekli değiller. Hepsi gerekli değildir.

Veya en azından soldaki soru işaretinden önce seçilenleri yeniden düzenleyin.

Genel olarak, ?: operatörünün if else ile eşdeğer olduğunu anlamanız yeterlidir.

Bir koşulu iki kez alırsınız. Bu durum yeterli

Ya da almak istediğiniz bir şeyi anlamadım.

Düşük/Yüksek ve Kapat/Kapat parametreleriyle K periyodu içinde normal maxHigh ve minLow stokastiklerini almak istiyorum

Başlatma sırasında Düşük/Yüksek iyi çalışıyor, ancak Kapat/Kapat çalışmıyor

 
Alexey Viktorov :

Parantezlerde bir sorun var. Benim düşünceme göre, burada hiç gerekli değiller. Hepsi gerekli değildir.

Veya en azından soldaki soru işaretinden önce seçilenleri yeniden düzenleyin.

Genel olarak, ?: operatörünün if else ile eşdeğer olduğunu anlamanız yeterlidir.

Bir koşulu iki kez alırsınız. Bu durum yeterli

ya da almak istediğiniz bir şeyi anlamadım.

hemen anlamadım ama öyle demek istediysen

 void KValues( int i)
  {
   vhigh = 0 ; vlow = High[i];
   int limit = i + ( int )kperiod;
   for ( int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ) ? High[a] : Close[a] > vhigh ? (price == STO_LOWHIGH ) ? High[a] : Close[a] : vhigh);
      vlow  = ((price == STO_LOWHIGH ) ? Low[a] : Close[a] < vlow ? (price == STO_LOWHIGH ) ? Low[a] : Close[a] : vlow);
     };
  }

benim sorunumu çözmüyor

Neden: