MT4 geliştiricilerinden ve programcılarından yardıma ihtiyacınız var - sayfa 7

 

Eh, sel yetiştirildi ...

Ayrıca EA döngüsünün kötü bir davranış olduğunu düşünüyorum. Parametreleri yalnızca başlatma döngüsünün bitiminden sonra değiştirmek oldukça mantıklıdır. Topikstarter, sorunun sonsuz döngüsünde olduğunu anlamadan edemedi, çünkü. amatör değildir. Ancak ilk mesajda EA'daki sonsuz döngü ile ilgili tek kelime yazmadım. Ben şahsen Uzman Danışmanlarda bu tür sistemler yapmadım, ancak anladığım kadarıyla, gönderilere bakılırsa, daha önce durum böyle değildi - döngülü Uzman Danışmanlarda parametreli pencere açılmadı. Bu, " Bu, mevcut EA'ların yeni MT4 yapıları ile temel bir uyumsuzluğa yol açar. " ifadesinin doğru olmadığı anlamına gelir - eski MT4 yapılarında, bu tür EA'lar aynı zamanda, pencereyi açmak imkansız olduğundan, parametrelerin değiştirilmesine izin vermedi. döngü tamamlandı.

EventSetMillisecondTimer sorunu gerçekten çözüyor. Ancak bu özellik ne zamandan beri var? Daha önce sadece EventSetTimer yok muydu? Minimum 1 saniyelik bir çağrı aralığı ile, gerçek ticaret için sistemler yazarken, her bir enstrüman için saniyede düzinelerce tick gelebildiğinde, böyle bir olay tamamen işe yaramaz .

Zamanlayıcılar için yardımda bu fonksiyona hala referans yok! Bir EventSet'e girerken ipucu olarak tesadüfen keşfettim.

 
Ancak, benim görüşüme göre, değişkenlerin başlatılmasıyla ilgili olarak, yeni MQL 4/5'te bir sorun ve bir tutarsızlık var: başlatma ve başlatma sırasında, global değişkenlerdeki dinamik nesneler silinmiyor ve yeniden oluşturulamıyor. Yani, global değişkenlerde dinamik olarak oluşturulan nesnelerin yapıcılarında EA'nın parametreleri okunursa ve bunlarla daha fazla çalışma yapılırsa, parametreler değiştirildiğinde, EA parametreler değiştirilmemiş gibi çalışmaya devam edecektir. Benim düşünceme göre, bu mantıklı değil ve global değişkenler danışman başlatmadan sonra sıfırlanmalı ve ardından danışman başlatmadan önce yeniden başlatılmalıdır. Bu, şu anda OnInit ve OnDeinit'te bu tür değişkenlerin başlatılması ve silinmesi yapılarak çözülmektedir.
 
AntFX :
Ancak bence, yeni MQL 4/5'te bir sorun ve bir tutarsızlık var: başlatma ve başlatma sırasında, global değişkenlerdeki dinamik nesneler silinmiyor ve yeniden oluşturulamıyor ...
Bu pratik bir açıklama... ama görünüşe göre geliştirici, programın yalnızca "doğumunun" ve "ölümünün" global değişkenlerin başlangıç değerini etkileyebileceğine karar verdi.
 
AntFX :
Ancak, benim görüşüme göre, değişkenlerin başlatılmasıyla ilgili olarak, yeni MQL 4/5'te bir sorun ve bir tutarsızlık var: başlatma ve başlatma sırasında, global değişkenlerdeki dinamik nesneler silinmiyor ve yeniden oluşturulamıyor. Yani, global değişkenlerde dinamik olarak oluşturulan nesnelerin yapıcılarında EA'nın parametreleri okunursa ve bunlarla daha fazla çalışma yapılırsa, parametreler değiştirildiğinde, EA parametreler değiştirilmemiş gibi çalışmaya devam edecektir. Benim düşünceme göre, bu mantıklı değil ve global değişkenler danışman başlatmadan sonra sıfırlanmalı ve ardından danışman başlatmadan önce yeniden başlatılmalıdır. Bu, şu anda OnInit ve OnDeinit'te bu tür değişkenlerin başlatılması ve silinmesi yapılarak çözülmektedir.

Evet, bu gerçek bir komisyondur, özellikle belgelerin (ne burada ne de burada ) yüklemenin şimdi başlatma olayı ile 1'e 1 bağlı olmadığı gerçeğine odaklanmadığı düşünüldüğünde. Bu sözler:

Global değişkenler, programı istemci terminalinin belleğine yükledikten hemen sonra başlatılır.

açıkçası geliştiricinin dikkatini sonraki parametre değişikliklerinin başlatmasızlaştırma ve başlatma ile sonuçlanacağı gerçeğine çekmek için yeterli değil, AMA buna karşılık gelen boşaltma ve yükleme OLMAYACAKTIR.

 
marketeer :

Evet, bu gerçek bir komisyondur, özellikle belgelerin (ne burada ne de burada ) yüklemenin şimdi başlatma olayı ile 1'e 1 bağlı olmadığı gerçeğine odaklanmadığı düşünüldüğünde. Bu sözler:

Genel değişkenler, program istemci terminalinin belleğine yüklendikten hemen sonra başlatılır.

açıkçası geliştiricinin dikkatini sonraki parametre değişikliklerinin başlatmasızlaştırma ve başlatma ile sonuçlanacağı gerçeğine çekmek için yeterli değil, AMA buna karşılık gelen boşaltma ve yükleme OLMAYACAKTIR.

Evet, değişkenlerin yüklenmesi/boşaltılması ve yeniden başlatılması gerekmez. Programcı, değişkenlerin başlatılmasıyla ilgilenmelidir.

 
Contender :

Evet, değişkenlerin yüklenmesi/boşaltılması ve yeniden başlatılması gerekmez. Programcı, değişkenlerin başlatılmasıyla ilgilenmelidir.

Bu sadece bu başlatma yapıldığında açıkça söylenmediği nokta. Global değişkenli kod:

int x = 0;

bu aynı zamanda bir başlatmadır. Ancak belgeler, bunun MK açısından sadece bir başlatma olmadığını açıkça belirtmiyor.

 
Açıkçası, MT'de artık 2 farklı başlatma vardır: biri program yüklendiğinde gerçekleştirilir ve ikincisi OnInit çağrıldığında "ortam" değiştirildiğinde. Ne yazık ki, kazılması gerekiyor.
 
marketeer :
Açıkçası, MT'de artık 2 farklı başlatma vardır: biri program yüklendiğinde gerçekleştirilir ve ikincisi OnInit çağrıldığında "ortam" değiştirildiğinde. Onu kazmak zorunda olman kötü.

Programı başlattığınızda - soğuk bir başlangıç. Değişkenler için bir bellek tahsisi ve bunların başlangıç değerleriyle başlatılması vardır.

İşyerinde - sıcak bir başlangıç. Burada programcı değişkenlerin başlatılmasıyla ilgilenmekle yükümlüdür ve bu iyidir.

 
Contender :

Programı başlattığınızda - soğuk başlatma. Değişkenler için bir bellek tahsisi ve bunların başlangıç değerleriyle başlatılması vardır.

İşyerinde - sıcak bir başlangıç. Burada programcı değişkenlerin başlatılmasıyla ilgilenmekle yükümlüdür ve bu iyidir.

İyi ya da kötü, bu felsefi bir soru ... ancak Belgelerde bu 0.0 bilgisinin iyi olmadığı gerçeği ...
 
denkir :
İyi ya da kötü, bu felsefi bir soru ... ancak Belgelerde bu 0.0 bilgisinin iyi olmadığı gerçeği ...

Üstelik doğru hatırlıyorsam, bu daha önce olmadı, yani en hafif tabirle programcıların “kolaylığı” için özellikle eklenen, ancak mevcut kodların değişmezliğini ihlal eden bir “özellik”. önceki başlatma kuralları). Bu nedenle, eski kodun yeni yazılım sürümleriyle uyumluluğunu korumanın sarsılmaz ilkesine, mümkün olan her yerde saygı gösterilmez.

Yeni özelliklere ve optimizasyonlara kimse karşı değil. Ama neden onları eski kodları kırmamak için yapmıyorsunuz? Özellikle, böyle yeni bir başlatma için, #property strict ile benzer şekilde ek bir önişlemci komutu tahsis etmek oldukça mümkündü. Örneğin, #property lazyinit yapın ve programcı tarafından kodda belirtilmişse (yani, açıkça, bu, mql'deki yeni başlatmanın farkında olduğu anlamına gelir), optimize edilmiş optimizasyondan memnunuz. Ve eğer belirtilmemişse, önceki kodların, global değişkenlerin kalabileceği herhangi bir kürekleme ve yakalama yeri olmadan kararlı bir şekilde çalıştığından memnunuz, ki bu şimdi, gördüğünüz gibi, yalnızca bildirilmesi değil, aynı zamanda OnInit'te ayrı olarak başlatılması da gerekiyor. Bu tür her değişken için bir kod satırı yerine 2 olacaktır.

Neden: