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

Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım 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
"-1" i sevmiyorsan, yapabilirsin
Hayır, bunu yapamazsınız - dizinize bu şekilde erişirseniz program çökecektir.
En iyi durumda, dahili dizilere erişirseniz, ihtiyacınız olan verileri kaçırırsınız veya onlara döngü içinde ulaşamazsınız.
Genel olarak, burada her şey basit, benzersiz, farklı sihirbazlar arasındaki eşleşmeyen tüm emirleri özetliyor..
Örneğin, 3 sipariş var
İlk yineleme büyüsü=1 benzersiz =0, yinelemenin sonunda benzersiz olacak=2
İkinci yineleme büyüsü=2 benzersiz =2, yinelemenin sonunda benzersiz olacak = 3
3>=tüm emirlerin sayısı olduğundan, while döngüsü bozulur.. Ve sihir =3 hiç kontrol edilmedi... Toplam sihir tekrar =2 ve hepsi ile böyle devam eder..
İlk sıraya varsayılan olarak sihirli = 1 verilir ve ardından döngü devreye alınır:
Yineleme büyüsünün başlangıcı = 1 benzersiz = 0, sonunda (sihir = 1 ile zaten bir sipariş olduğunda) büyü hala 1 ve benzersiz = 0
İkinci yineleme büyüsü = 2 benzersiz = 0, sonunda, büyü = 2 ve benzersiz = 1 (eşleşme yok) ve rethorn ile 2. sıra büyü = 2'ye atanır.
Üçüncüsü de aynı olmalıydı...
Tüm süreci yazdırmak istedim ama bir şeyler ters gitti:
İlk sıraya varsayılan olarak sihirli = 1 verilir ve ardından döngü devreye alınır:
Yineleme büyüsünün başlangıcı = 1 benzersiz = 0, sonunda (sihir = 1 ile zaten bir sipariş olduğunda) büyü hala 1 ve benzersiz = 0
İkinci yineleme büyüsü = 2 benzersiz = 0, sonunda, büyü = 2 ve benzersiz = 1 (eşleşme yok) ve rethorn ile 2. sıra büyü = 2'ye atanır.
Üçüncüsü de aynı olmalıydı...
Tüm süreci yazdırmak istedim ama bir şeyler ters gitti:
int GetMagic() { int magic = 0 ; int unique = 0 ; if ( OrdersTotal ()){ do { magic++; for ( int i = OrdersTotal () - 1 ; i >= 0 ; i --){ if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)){ if (magic != OrderMagicNumber()) unique ++; } } Print ( " MAGIC " , magic, " | UNIQUE " , unique) ; // <--- } while (unique < OrdersTotal ()); } else return (magic + 1 ); return (magic); }
Daha fazlasını hedefleyin - TÜM programlama dilleri .
Çok basit - programlama dillerinde geri sayım sıfırdan başlar. Dizinin ilk hücresinin indeksi 0 olacaktır. Bu nedenle, onu DAHİL olarak sıfıra geri döndürmeniz gerekir. Onlar. >=0
OrdersTotal() örneğin 10'u verir. Ve döngüye 10'dan başlarsınız. Ve dizinin son indeksi 9'a sahiptir (sıfırdan başladığımızı hatırlıyor musunuz?). Ve var olmayan bir dizi hücresine eriştiğinizde ne olur? Bu doğru - program kritik bir hata nedeniyle çöktü, çünkü dizi için ayrılmamış bellek alanına tırmandınız - sınırlarının ötesinde .
Bu tam olarak sağlam koltuk değneği . Okuyun, çalışın ve her şey size gelecektir.
Tonlarca ücretsiz ve iyi C/C++ kursu var.
Mql onlara yakındır ve özgürce öğrenebilirsiniz. Neyse ki, derin bilgi gerekli değildir. Ama en azından dilin sözdizimi ve algoritmaların temel temelleri.
Aksi takdirde, platform ve algoritmalar üzerine istişareler yerine, ilkokul düzeyinde diyaloglar yerine konuyla ilgili bazı saçmalıklar ortaya çıkıyor - nereye koymak; döngü nedir ve neden 0 ile indekslenir
örneğin, bir site intuit.ru var - C ve algoritmalar üzerine kurslar var, zamanınızı en fazla birkaç hafta geçirin. Aynı zamanda, bir parça kağıt alabilirsiniz :-)
Aksi takdirde, platform ve algoritmalar üzerine istişareler yerine, ilkokul düzeyinde diyaloglar yerine konuyla ilgili bazı saçmalıklar ortaya çıkıyor - nereye koymak; döngü nedir ve neden 0 ile indekslenir
örneğin, bir intuit.ru sitesi var - C ve algoritmalar üzerine kurslar var, zamanınızı en fazla birkaç hafta geçirin. Aynı zamanda, bir parça kağıt alabilirsiniz :-)
Bunun gibi?
OrdersTotal() örneğin 10'u verir. Ve döngüye 10'dan başlarsınız. Ve dizinin son indeksi 9'a sahiptir (sıfırdan başladığımızı hatırlıyor musunuz?). Ve var olmayan bir dizi hücresine eriştiğinizde ne olur? Bu doğru - program kritik bir hata nedeniyle çöktü, çünkü dizi için ayrılmamış bellek alanına tırmandınız - sınırlarının ötesinde .
Biraz düzelteceğim.. Kritik bir hata olmayacak, sadece bir boolean OrderSelect false döndürecek .. ve hepsi bu.. Ama elbette kaçınmak daha iyi.. Çünkü kodun yeteneklerini yanlış kullanırsanız, zor olası söveleri tahmin etmek için ..
İlk sıraya varsayılan olarak sihirli = 1 verilir ve ardından döngü devreye alınır:
Yineleme büyüsünün başlangıcı = 1 benzersiz = 0, sonunda (sihir = 1 ile zaten bir sipariş olduğunda) büyü hala 1 ve benzersiz = 0
İkinci yineleme sihirli = 2 benzersiz = 0, sonunda, büyü = 2 ve benzersiz = 1 (eşleşme yok) ve imbik tarafından 2. sıraya magic = 2 atanır.
Üçüncüsü de aynı olmalıydı...
Sadece benzersizin doldurulmasının çok hızlı olduğunu ve sınıra ulaştığını ve sihrin zar zor büyüdüğünü görüyorum.
Bu bağlamda bir çözüm bulmak için yazdırın, ancak sorunu yeniden formüle etmenizi tavsiye ederim.. Örneğin, bir döngüdeki emirlerin maksimum büyüsünü bulun ve +1 ile geri gönderin, bu doğru basit çözüm olacaktır.
Bunu yapabilirsiniz, kod gerektiği gibi çağrılır, böylece ağırlığı sorun yaratmaz
Test için Al/Sat kullandım
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma
Vitaly Muzichenko , 2021.10.19 23:08
Biraz düzelteceğim.. Kritik bir hata olmayacak, sadece bir boolean OrderSelect false döndürecek .. ve hepsi bu.. Ama elbette kaçınmak daha iyi.. Çünkü kodun yeteneklerini yanlış kullanırsanız, zor olası söveleri tahmin etmek için ..
Sadece benzersizin doldurulmasının çok hızlı olduğunu ve sınıra ulaştığını ve sihrin zar zor büyüdüğünü görüyorum.
Bu bağlamda bir çözüm bulmak için yazdırın, ancak sorunu basitçe yeniden formüle etmenizi tavsiye ederim.. Örneğin, bir döngüdeki siparişlerin maksimum büyüsünü bulun ve +1 ile geri gönderin , bu doğru basit çözüm olacaktır.
Bunu yapabilirsiniz, kod gerektiği gibi çağrılır, böylece ağırlığı sorun yaratmaz
Test için Al/Sat kullandım