Hatalar, hatalar, sorular - sayfa 1999

 
Alexey Viktorov :

Örnek olarak gösterge arabellek dizisini ele alalım: Göstergeyi başlatırken, arabelleğin uzunluğu sıfırdır. Sıfırlarla başlatılacak ne var? Bir sonraki dizini eklerken, onu sıfırlamaya ve ardından bir değerle doldurmaya zorlanır ??? Bu sıfırlama veya EMPTY_VALUE ile doldurma ne için ? Ve eğer 0 değil, EMPTY_VALUE değil PLOT_EMPTY_VALUE atamak gerekiyorsa ya da biri zorlanmış, başka birine ihtiyaç duyuluyorsa... Kim ne derse desin zaman kaybı oluyor...

Ve özel bir dizi... Sıfır olmayan bazı veriler için bir dizi bildirildi ve BOŞ_VALUE. Öyleyse, onu bir şeyle zorla başlatmanın amacı nedir?

Bu yüzden çoğu durumda performansı etkilediği ortaya çıkıyor.

Hayattan kopmuş gibiyim. Benim için gösterge arabelleği her zaman çubuk sayısına eşit bir uzunluğa sahiptir. Ve onu MT5'te başlatmayı reddetmek, ekranda çöplerin görüntülenmesine yol açar. Açık başlatmanın gerekli olduğu ortaya çıktı. Ve neden basitçe çekirdekten (MT4'te olduğu gibi) MQL programlayıcısına kaydırıldığı açık değil. Başlatma yapmadan ve aynı zamanda çöp görüntülenmeden hızlandırmanın bir şekilde mümkün olduğuna dair gerçek bir argüman görmedim.

Özel bir dinamik dizi hakkında hiçbir şey söylemiyorum - gerçekten bir kural var: onu tahsis eden kişi uygun temizlikten sorumludur. ArrayInitialize birçok durumda yararlıdır. Bu bir hız sorunu değil, programın doğruluğu sorunudur. Önceliklendirme: hızlı ve/veya doğru. Genellikle, doğruluk ve veri hazırlama için bazı kontroller ek zaman maliyetleri gerektirir (minimum da olsa), ancak bu olmadan mucize olmaz.

 
Stanislav Korotky :

Özel bir dinamik dizi hakkında hiçbir şey söylemiyorum - gerçekten bir kural var: onu tahsis eden kişi uygun temizlikten sorumludur.

Dizileri rahatsız etmek gerekli değildir.

 #property strict

void OnStart ()
{
   uchar Array[];
  
   const int Size = ArrayResize (Array, 10000 );
  
   bool Res = false ;
  
   for ( int i = 0 ; (i < Size) && (!Res); i++)
    Res = Array[i];
    
   Print (Res);
}

MT4'te her zaman false döndürür, çünkü çöp olmadan - her şey sıfırdır. MT5'te - doğru.

Bu nedenle, MT4 test cihazındaki aynı kod, çalıştırmadan çalıştırmaya her zaman aynı sonuçları gösterecektir. MT5 test cihazında değil.

 
fxsaber :

MT4'te her zaman false döndürür, çünkü çöp olmadan - her şey sıfırdır. MT5'te - doğru.

Bu, MT4'ün diziyi sıfırlarla doldurduğu bir test mi? Ardından, ArrayResize bir yedekle üçüncü bir parametre kullanıyorsa, yedek içindeki sonraki yeniden tahsislerin hiçbir şeyi başlatmayacağını aklınızda bulundurmanız gerekir. Çöp olacak. Bu tartışmayı başlatan optimizasyon örneğinde olduğu gibi, daha sonra yanlışlıkla şaşırmamak için açık başlatma yapmanızı öneririm.

Başlatma nedeniyle yavaşlamalardan endişe edenler için, genellikle verimliliği çok daha fazla artırabileceğiniz bir sürü başka yer ve püf noktası olduğunu tahmin ediyorum.

 
Stanislav Korotky :

Bu, MT4'ün diziyi sıfırlarla doldurduğu bir test mi? Ardından, ArrayResize bir yedekle üçüncü bir parametre kullanıyorsa, yedek içindeki sonraki yeniden tahsislerin hiçbir şeyi başlatmayacağını aklınızda bulundurmanız gerekir. Çöp olacak.

Çöp olmayacak.

Bu tartışmayı başlatan optimizasyon örneğinde olduğu gibi, daha sonra yanlışlıkla şaşırmamak için açık başlatma yapmanızı öneririm.

kurtarmayacak

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

fxsaber , 2017.09.12 11:18

Mükemmel yazmış olsam bile (hata yapmadan - ki durum böyle değil), birinin kütüphanesini (bazen kaynak kodu olmadan - Market'te) alıp doğru yazıldığını umarak kullandığınızda durum normaldir. Ve hiçbir şey bundan sonra test cihazında çeşitli sonuçlarla karşılaşacağımı garanti etmez. Ve gerçek sebebi bulmak ÇOK zor olacak. Düzeltmek bazen imkansızdır.

Amaç, sonucu bir hatayla bile aynı - her çalışmadan tekrarlanabilir hale getirmektir.

 
fxsaber :

Çöp olmayacak.



O zaman belgeleri düzeltmek gerekli mi?

Bir dizinin ArrayInitialize (dizi, init_val) ifadesi ile başlatılması, bu dizi için ayrılan rezervin öğelerinin aynı değerle başlatıldığı anlamına gelmez. Geçerli rezerv içindeki ArrayResize() işlevi tarafından dizi dizisinin boyutunda sonraki artışlarla, dizinin sonuna , değerleri tanımlanmayan ve çoğu zaman init_val'e eşit olmayan öğeler eklenir. .

 
Stanislav Korotky :

O zaman belgeleri düzeltmek gerekli mi?

Bir dizinin ArrayInitialize (dizi, init_val) ifadesi ile başlatılması, bu dizi için ayrılan rezervin öğelerinin aynı değerle başlatıldığı anlamına gelmez. Geçerli rezerv içindeki ArrayResize() işlevi tarafından dizi dizisinin boyutunda sonraki artışlarla, dizinin sonuna , değerleri tanımlanmayan ve çoğu zaman init_val'e eşit olmayan öğeler eklenir. .

Hayır, çünkü MT4 belgelerinde böyle bir şey yok.


Bir çeşit matta olduğu düşüncesini korkutuyor. kitaplığı (Include\Math - 7 Mb kaynakları ) bir/iki yerde başlatılmadı! Ve MT5 test cihazında farklı tek çalıştırmalar ve MT4'te aynı olanları veren bu hatayı nasıl çözebilirim?

 
Stanislav Korotky :

Hayattan kopmuş gibiyim. Benim için gösterge arabelleği her zaman çubuk sayısına eşit bir uzunluğa sahiptir. Ve onu MT5'te başlatmayı reddetmek, ekranda çöplerin görüntülenmesine yol açar. Açık başlatmanın gerekli olduğu ortaya çıktı. Ve neden basitçe çekirdekten (MT4'te olduğu gibi) MQL programlayıcısına kaydırıldığı açık değil. Başlatma yapmadan ve aynı zamanda çöp görüntülenmeden hızlandırmanın bir şekilde mümkün olduğuna dair gerçek bir argüman görmedim.

Özel bir dinamik dizi hakkında hiçbir şey söylemiyorum - gerçekten bir kural var: onu tahsis eden kişi uygun temizlikten sorumludur. ArrayInitialize birçok durumda yararlıdır. Bu bir hız sorunu değil, programın doğruluğu sorunudur. Önceliklendirme: hızlı ve/veya doğru. Genellikle, doğruluk ve veri hazırlama için bazı kontroller ek zaman maliyetleri gerektirir (minimum da olsa), ancak bu olmadan mucize olmaz.

cümleye dikkat etmemişsin

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

Alexey Viktorov , 2017.09.12 10:50

Örnek olarak gösterge arabellek dizisini ele alalım: Göstergeyi başlatırken, arabelleğin uzunluğu sıfırdır. Sıfırlarla başlatılacak ne var? Bir sonraki dizini eklerken, onu sıfırlamaya ve ardından bir değerle doldurmaya zorlanır ??? Bu sıfırlama veya EMPTY_VALUE ile doldurma ne için ? Ve eğer 0 değil, EMPTY_VALUE değil PLOT_EMPTY_VALUE atamak gerekiyorsa ya da biri zorlanmış, başka birine ihtiyaç duyuluyorsa... Kim ne derse desin zaman kaybı oluyor...

Ve özel bir dizi... Sıfır olmayan bazı veriler için bir dizi bildirildi ve BOŞ_VALUE. Öyleyse, onu bir şeyle zorla başlatmanın amacı nedir?

Bu yüzden çoğu durumda performansı etkilediği ortaya çıkıyor.



Ve bunu zaten OnCalculate'de yapmak hiç mantıklı değil. Diziyi bir şeyle başlatmanın ve ardından onu formülden bazı değerlerle doldurmanın nedeni nedir? Sırasıyla bir çubuk ve bir dizi hücresi eklerken, onu bir şeyle ve hemen formüldeki değerle veya boş bir değerle doldurmanın amacı nedir?

 
Alexey Viktorov :

Ve bunu zaten OnCalculate'de yapmak hiç mantıklı değil. Diziyi bir şeyle başlatmanın ve ardından onu formülden bazı değerlerle doldurmanın nedeni nedir? Sırasıyla bir çubuk ve bir dizi hücresi eklerken, onu bir şeyle ve hemen formüldeki değerle veya boş bir değerle doldurmanın amacı nedir?

Yalnızca yeni dizi öğeleri başlatılır. Ve anlam aynıdır - kodda bir hata olsa bile (çoğunlukla kendisinin değil) çalıştırmadan çalıştırmaya sonuçların kimliği. Mat ile örnek. İncil yukarıda alıntılanmıştır.

Çöp kötüdür.

 
fxsaber :

Hayır, çünkü MT4 belgelerinde böyle bir şey yok.

O zaman nereden çıkardım? Buraya gidiyoruz.

ArrayInitialize - Операции с массивами - Справочник MQL4
ArrayInitialize - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArrayInitialize - Операции с массивами - Справочник MQL4
 
Stanislav Korotky :

O zaman nereden aldım? Buraya gidiyoruz.

Yani orada ArrayResize ile ilgili değil, ArrayInitialize ile ilgili. ArrayResize, MT4'te boş doldurmayı garanti eder.


İlgi için, MT5 için tüm kaynaklarıma baktım, ArrayInitialize'ı ne sıklıkla kullandığım. Birim kez. Tüm dinamik dizilerin yüzde birinden daha az gibi görünüyor. Ve onu kullandığım yerde, özellikle sıfırlarla puanlamak gerekiyordu, bu yüzden bunun yerine daha kısa bir notasyon kullandım.