uzman danışman - çeşitli sorular - sayfa 13

 

Şöyle bir fonksiyon yazabilirsiniz:

void DrawLabel( string name, string text, int x, int y, int  fontsize = 10 )

Son değer olmadan çağırırsanız, varsayılan değer kullanılacaktır, yani yazı tipi boyutu 10 olacaktır.

DrawLabel( "MyLabel" , "Hello,World!" , 50 , 50 ); // final parameter not passed (default value used)

Veya varsayılan yazı tipi boyutu değerini açıkça geçersiz kılabilirsiniz:

DrawLabel( "MyLabel" , "Hello,World!" , 50 , 50 , 24 ); // fontsize parameter is 24

Demek istediğin bu mu?

 
honest_knave :

Demek istediğin bu mu?

Belki de İngilizcem yorumunuzu anlamayı engelliyor.
Yorumun için teşekkürler.
Eğer doğru anladıysam şöyle anlıyorum: Label için 1x Void fonksiyonu yazabilirim ve aşağıdaki gibi iki yöntemle kullanabilirim. ( Yazı tipi boyutu parametreli ve onsuz etiket nesnesi için bir Void işlevi kullanabilirim , bu doğru mu? )

DrawLabel( "MyLabel" , "Hello,World!" , 50 , 50 );     // #1
DrawLabel( "MyLabel" , "Hello,World!" , 50 , 50 , 24 ); // #2

Bu nedenle, bu Elektronik Tablo Nesnesi için bu sorunun nereden geldiği ve nasıl çözebileceğim için birkaç saat harcadığımı söylemek isterim.
Bu yüzden, Etiket işlevlerinden değil, aşağıdaki koddan geldiğini hissediyorum, çünkü 2x Etiket işlevim vardı, bunlardan birini kaldırdım, Teklif Et ve Al fiyat göstergeleri (piyasa fiyatları) hala iyi çalışıyor, ancak Elektronik Tablo Etiket işleviyle çalışmıyor . E-tablo, Etiket işlevi olmadan iyi çalışır.

Elektronik Tablodan bazı kodları paylaşmam gerekiyor. Aşağıdaki kod gibi şüpheliyim. ( Hatta - E-Tablo için Label işlevi olmadan Label nesnesi oluşturduğumda aşağıdaki kodun iyi çalıştığını bir kez daha belirtmem gerekiyor )

double   spread                                                 ;
        spread       = MarketInfo   ( symbol, MODE_SPREAD ) / 10 ;
        spreadstring = DoubleToStr ( spread, 1            )     ;

Her şey için teşekkürler.

 

Yaratmaya çalıştığınız bir şeyin gerçekten yaratıldığını doğrulamak için iyi bir uygulama.

Örneğin, ekran boyutları söz konusu olduğunda, birçok kullanıcı farklı çözünürlükler kullanır ve ne zaman bir nesnenin grafik genişliği veya yüksekliği sınırları üzerinde oluşturulduğunda, nesne çizilmez veya kaybolmaz.

Veya örneğin 4200 hatası, oluşturmaya çalıştığınız nesnenin zaten var olduğunu gösterecektir.

Bu, nesnenize farklı değerler atamaya çalışıyorsanız önemlidir, oluşturma başarısız olursa yeni değerler atanmayacaktır.

Oluşturmanın başarılı olup olmadığını kontrol edebilmeniz için bu işlevlerin bir değer döndürmesinin nedeni budur.

İşlevin başarılı olup olmadığını kontrol etmek size kalmış, ancak iyi bir kodlayıcı sonucu kontrol edecektir.

Bir void işlevi yazarsanız, hiçbir şey döndürmez, bu nedenle çağırdığınızda neyin geri geldiğini analiz ederek sonucu kontrol edemezsiniz.

Ancak, işlevin kendisini de kontrol edebilir ve bir şeyler ters gittiğinde basit bir uyarı verebilirsiniz.

Bunu yaparsanız, normal olarak bu uyarıları görmezsiniz, ancak bir şeyler ters gittiğinde, sizi hemen sorunun kendisine yönlendirir.


İkinci sayı için birçok kez en azından bazı parametreleri atlayabilirsiniz, bunu yaparsanız fonksiyon varsayılan değerleri alacaktır.

Bu nedenle, standart parametrelere ihtiyaç duymadığınız veya yönlendirmek istemediğiniz sürece, bunları belirtin.

Yazı tipi boyutu, belirtmediğiniz zaman sadece varsayılan ayarları kullanacağı için iyi bir örnektir.

Ayrıca belirli nesneler arasında küçük farklılıklar vardır ve bu, işleve iletilen parametreler analiz edilirken görülebilir.

Hepsi aynı değişken setini paylaşmazlar, bu nedenle referans olarak nelerin geçirilip nelerin iletilemeyeceğine bakmak önemlidir.

Yayma ipiyle ne yapmak istediğinizden emin değilim, belki biraz daha ne için olduğunu ve nasıl kullanmak istediğinizi açıklayabilirsiniz?

 
Marco vd Heijden :

Yayma ipiyle ne yapmak istediğinizden emin değilim, belki biraz daha ne için olduğunu ve nasıl kullanmak istediğinizi açıklayabilirsiniz?

Teklif , Sor , Elektronik Tablo vb. için Etiket Nesnesi İşlevini kullanıyorum. Elektronik tablo olmadan her şey mükemmel çalışıyor - ve onu silip yeniden yazdım, iyi bir etki olmadı.

Hata açıklaması için @honest_knave hata kodunu kullandıktan sonra. Daha fazla 4200 uyarısı görmüyorum.
Bahsettiğim gibi ' Elektronik Tablo'yu iki yerde, Init() işlevinde #1 - OnTick() işlevinde #2 kullanıyorum, ancak 'Spreadsheet' ile 2 yerde Bid, Ask kullanıyorum, herhangi bir hata, uyarı yok . Ancak bu elektronik tablo bana herhangi bir uyarı vermiyor, aynı zamanda güncellenmiyor.

EA'mın kodlarında herhangi bir nesne için oluşturma kesinlikle başarılı, hata yok, uyarı yok.

İyi kodlayıcı olduğumu bilmiyorum ya da ne?! (Kodlayıcı veya programcı olduğumu düşünmüyorum.) Ama sonucu görüyorum. Bu nedenle, yalnızca Etiket Nesnesi kullanabilirim (yalnızca elektronik tablo için işlevsiz).

Void işlevi istediklerimin sonuçlarını döndürür, ayrıca bu işlev ilk yayılma değeri için nesne oluşturur, ancak güncelleme yapmaz.



Yayma ipiyle ne yapmak istediğinizden emin değilim, belki biraz daha ne için olduğunu ve nasıl kullanmak istediğinizi açıklayabilirsiniz?

Tamam, sadece şu şekilde kullanmak istiyorum: Sadece şu an için EA'larımı açtığımda / grafiğe eklediğimde bana Elektronik Tablo Boyutunu ( / Value ) vermesini istiyorum. Daha sonra şu anki Hour Spread High / Low boyutları ( / değerleri ) için kod yazmaya çalışacağım.

Şimdiden teşekkürler.

 

Ayrıca onu bir çift dizide[] saklayabilir ve ardından en düşük yayılımın nerede olduğunu görmek için hepsini karşılaştırabilirsiniz.


double spread[];
--

ArrayResize (spread, SymbolsTotal ( 1 ), 0 );
   for ( int i= 0 ;i< SymbolsTotal ( 1 );i++)
     {
      spread[i]= MarketInfo ( SymbolName (i, 1 ), 13 );
     }
 

Aşağıdaki kodu kaldırdığımda, elektronik tablo mükemmel çalışmaya başlıyor.
Yani, sadece yardım etmem gerekiyor , bunun yerine nasıl iyi ( / Optimal ) kod yazabilirim lütfen?

{
     Print ( __FUNCTION__ , ": failed to create text label! Error code = " , GetLastError ());
     return ( false );
}

Etiket Nesnesi işlevi için aşağıdaki kodu saklıyorum.

if ( ! ObjectCreate ( chart_ID, name, OBJ_LABEL , sub_window, 0 , 0 ) ) 

Şimdiden teşekkürler.

(bu sorun gerçekten bir sorunsa - umarım MetaQuotes sorunu çözer - çünkü benden birkaç saat sürdü, bu kod endüstrisinde yeni olanlara yardım edin)

 

"Return(false)" ifadesini silin, ancak Print deyimini saklayın ve kodunuzu çalıştırın.

Sanırım bazı mesajlar alabilirsin. Değeri değiştirmek yerine etiketi tekrar tekrar oluşturmaya çalıştığınızı düşünüyorum.

 
honest_knave :

"Return(false)" ifadesini silin, ancak Print deyimini saklayın ve kodunuzu çalıştırın.

NE OLUYOR BE!
Bu bok benim birkaç saatimi aldı, bunun hakkında ne söyleyebilirim bilmiyorum.
Bunu tüm Nesneler işlevlerimden kaldırabilir miyim?
Ayrıca nasıl çalıştığı hakkında bilgi verir misiniz?

return ( false );

Sadece teşekkürler dostum.

 
Max Enrik :

NE OLUYOR BE!
Bunu tüm Nesneler işlevlerimden kaldırabilir miyim?

Evet, ancak onu tutmak ve hatanın kaynağını ele almak daha iyi olur.

Max Enrik :

NE OLUYOR BE!
Ayrıca nasıl çalıştığı hakkında bilgi verir misiniz?

return ( false );

Dönüş operatörü , fonksiyona hemen çıkmasını söyler. İşlev bir değer döndürürse (sizin durumunuzda bu bir bool'dur), ayrıca bir değer döndürmeniz gerekir.

Nesneyi oluşturmadan önce var olup olmadığını kontrol ederseniz, hatanızdan (4200, değil mi?) kurtulacaksınız.

Return Operator - Operators - Language Basics - MQL4 Reference
Return Operator - Operators - Language Basics - MQL4 Reference
  • docs.mql4.com
Return Operator - Operators - Language Basics - MQL4 Reference
 
honest_knave :

Açıkça yaptığın yorumlar için teşekkürler dostum.

Ben zaten aşağıdaki kod gibi yönteminizle değiştiriyorum. ( Etiket Nesnesi işlevi için )

Oldu - hata açıklaması hakkındaki yorumlarınızdan önce:

if ( ! ObjectCreate ( chart_ID, name, OBJ_LABEL , sub_window, 0 , 0 ) )
{
     Print ( __FUNCTION__ , ": failed to create text label! Error code = " , GetLastError () );
     return ( false );
}

// which one this code gives me error no: 4200 

sonrasında:

if ( ! ObjectCreate ( chart_ID, name, OBJ_LABEL , sub_window, 0 , 0 ) )
{
     if ( errorcode != 0 ) printf ( "Error %i: %s" , errorcode, ErrorDescription( errorcode ) );
     return ( false );
}

// prevent error no: 4200 - but was not update spreadsheet values 

Şimdi - ve mükemmel çalışıyor:

if ( ! ObjectCreate ( chart_ID, name, OBJ_LABEL , sub_window, 0 , 0 ) )
{
     if ( errorcode != 0 ) printf ( "Error %i: %s" , errorcode, ErrorDescription( errorcode ) );
     return ( false ); // removed this line
}

// now spreadsheet values updates, no any more error no: 4200 

Senin için her şeyin en iyisini dilerim.
Neden: