genel başlatma başarısız !!!!!!! - sayfa 5

 
deysmacro :
Comment() çoğu zaman grafiği etkilemez.

   if ( ObjectFind ( Symbol ()+ "Lot_Size_Label" )== 0 )
   {         
   int x_check= ObjectGet ( Symbol ()+ "Lot_Size_Label" , OBJPROP_XDISTANCE );
   int y_check= ObjectGet ( Symbol ()+ "Lot_Size_Label" , OBJPROP_YDISTANCE );
   Comment (x_check+ " , " +y_check); 
   }

Kod verilerinin ne olduğunu kontrol etmek için Comment().

Etiket doğru gittiğinde değişmeleri gerekir, ancak yapmazlar.

IOW, kodlar olması gerektiği gibi.

Etiket sağda kaybolur.

 

Koordinat XDISTANCE = 225; YDISTANCE = 27; KÖŞE = 3;

İlk olarak, indi'yi grafiğe yükleyerek, yerinde etiketleyin:

İkinci olarak, MT4'ü kapatıp yeniden başlattığınızda, etiket sağa gider:

Üçüncüsü, Tf'leri değiştirdikten sonra etiket geri atlar:

Köşe hesaplamalarıyla ilgili Çapalarla ilgili bir şey ve B646'da bir hata olmalı.

 
Bunların küresel başlatmanın başarısız olmasıyla ne ilgisi var?
 
SDC :
Bunların küresel başlatmanın başarısız olmasıyla ne ilgisi var?

Bu B646 ciddi şekilde tıkanmış!
 
Dadas :


Teşekkürler, deinit'te silinmeyen nesnelerle aynı sorunu yaşadım.

Bazı indi geliştiriyordum ve bu garip sonuçları aldım, sonra nesneler listesinde gördüm, hala oradaydılar.

Bunu muhtemelen en basit şekilde start() içindeki ObjectDelete() ile çözdüm.

Evet, init() öğesini OnInit() olarak ve deinit() öğesini OnDeinit() olarak değiştirmek, etiketleri doğru şekilde geri aldı! Teşekkürler!

Sonra bir süre sonra olmadı!!! Hala aynı dansı yapıyorlar.


Rica ederim Dadalar. Yine de başlangıç yönteminde ObjectDelete() kullanmazdım . Bu en iyi OnDeInit() içinde yapılır. Bunun nedeni şudur: Kodu OnStart() veya OnCalculate() içine koyarsanız, her tik geldiğinde çalıştırılacaktır. Bu iki nedenden dolayı kötüdür: 1) gerçek zamanlı bir uygulamada boşa harcamayı göze alamayacağınız çok sayıda işlem ekler ve 2) çoğu durumda bunu yapmak mantıklı değildir - genellikle yalnızca bir grafik başlatıldığında önemli olacak. Bunu sadece "başlangıç" yöntemlerinde, bir fiyat değişikliği nesnelerinizi bir şekilde etkileyecekse yapmalısınız. Örnek olarak, bunu düşünün (bu, satmayı düşündüğüm bir uygulamanın parçası, ancak bunu paylaşmak harika :-)).

 // If no trade is progress, there is no Position Value to display
       if ( ObjectFind ( "PositionValue" ) > 0 )
                 ObjectDelete ( "PositionValue" );
                
       if ( ObjectFind ( "PipsProfitLoss" ) > 0 )
                 ObjectDelete ( "PipsProfitLoss" );
                
       if ( ObjectFind ( "CurrentStop" ) > 0 )
                 ObjectDelete ( "CurrentStop" );
                
       if ( ObjectFind ( "PipsLockedIn" ) > 0 )
                 ObjectDelete ( "PipsLockedIn" );
                
       if ( ObjectFind ( "ProfitLockedIn" ) > 0 )
                 ObjectDelete ( "ProfitLockedIn" );
                
       if ( GlobalVariableCheck (CurrentPairPercentageRisk))
         GlobalVariableDel (CurrentPairPercentageRisk);

Bu kod, varsa kapalı bir ticaretten kalan nesneleri yakalar.

Bu arada - bunu YAPMAYIN:

 string AcctCurrency = AccountCurrency ();
       
       if (AcctCurrency == "" )
           return (rates_total);

Kodun amacını yanlış anladınız. Sunucu "yerleşene" kadar indie'yi ÇALIŞTIRMAMAK üzere tasarlanmıştır. Bu yüzden 0 döndürüyorum. Bu şekilde, bağımsız kod, ihtiyaç duyduğu tüm bilgiler mevcut olana kadar yürütülmez. Dürüst olmak gerekirse, henüz OnCalculate() ile çalışmadım çünkü ihtiyacım olmadı ama yaptığınız şeyin bir felakete davetiye olduğunu söyleyebilirim. Programınıza "Geçerli verileriniz olana kadar bu kodu çalıştırmayın" demiyorsunuz. Sadece rüzgara bir şeyler atıyorsun ve en iyisini umuyorsun. Doğruyu söylemek gerekirse, sunucudan güvenilir bilgi almasaydı kodunuz ne yapardı bilmiyorum. Önemli miktarda okumadan sonra, yeni OnCalculate() yöntemi bana hiçbir anlam ifade etmiyor. Bana öyle geliyor ki, ihtiyacınız olduğunda kendiniz için yapacağınız bir yük bilgisini gereksiz yere hesaplayıp vermek ve ihtiyacınız olmayan şeylerle uğraşmayarak kendinize hesaplama süresinden tasarruf etmek gibi geliyor. Bununla neyi başarmaya çalıştıklarından emin değilim.

Mutlu Kodlama!

 
ProfessorMetal :


Rica ederim Dadalar. Yine de başlangıç yönteminde ObjectDelete() kullanmazdım. Bu en iyi OnDeInit() içinde yapılır. Bunun nedeni şudur: Kodu OnStart() veya OnCalculate() içine koyarsanız, her tik geldiğinde çalıştırılacaktır. Bu iki nedenden dolayı kötüdür: 1) gerçek zamanlı bir uygulamada boşa harcamayı göze alamayacağınız çok sayıda işlem ekler ve 2) çoğu durumda bunu yapmak mantıklı değildir - genellikle yalnızca bir grafik başlatıldığında önemli olacak. Bunu sadece "başlangıç" yöntemlerinde, bir fiyat değişikliği nesnelerinizi bir şekilde etkileyecekse yapmalısınız. Örnek olarak, bunu düşünün (bu, satmayı düşündüğüm bir uygulamanın parçası, ancak bunu paylaşmak harika :-)).

Bu kod, varsa kapalı bir ticaretten kalan nesneleri yakalar.

Bu arada - bunu YAPMAYIN:

Kodun amacını yanlış anladınız. Sunucu "yerleşene" kadar indie'yi ÇALIŞTIRMAMAK üzere tasarlanmıştır. Bu yüzden 0 döndürüyorum. Bu şekilde, bağımsız kod, ihtiyaç duyduğu tüm bilgiler mevcut olana kadar yürütülmez. Dürüst olmak gerekirse, henüz OnCalculate() ile çalışmadım çünkü ihtiyacım olmadı ama yaptığınız şeyin bir felakete davetiye olduğunu söyleyebilirim. Programınıza "Geçerli verileriniz olana kadar bu kodu çalıştırmayın" demiyorsunuz. Sadece rüzgara bir şeyler atıyorsun ve en iyisini umuyorsun. Doğruyu söylemek gerekirse, sunucudan güvenilir bilgi almasaydı kodunuz ne yapardı bilmiyorum. Önemli miktarda okumadan sonra, yeni OnCalculate() yöntemi bana hiçbir anlam ifade etmiyor. Bana öyle geliyor ki, ihtiyacınız olduğunda kendiniz için yapacağınız bir yük bilgisini gereksiz yere hesaplayıp vermek ve ihtiyacınız olmayan şeylerle uğraşmayarak kendinize hesaplama süresinden tasarruf etmek gibi geliyor. Bununla neyi başarmaya çalıştıklarından emin değilim.

Mutlu Kodlama!


Tekrar teşekkürler!

Yüzen etiketlerin cevabını buldum.

Görünüşe göre şimdi Nesne Çapasını kodun kendisinde Bağlamalıyız:

https://docs.mql4.com/en/constants/objectconstants/enum_anchorpoint

Bu yüzden, aşağıdaki gibi bir şey eklemeliyim:

 if (Corner== 0 ) Anchor= ANCHOR_LEFT ;
if (Corner== 1 ) Anchor= ANCHOR_RIGHT ;
if (Corner== 2 ) Anchor= ANCHOR_LEFT ;
if (Corner== 3 ) Anchor= ANCHOR_RIGHT ; 

ve sonra nesneyi ayarlamak için başka bir satır kullanın:

     ObjectSet (objname, OBJPROP_ANCHOR ,Anchor);

Hayat kesinlikle kolaylaşmıyor!

Ve sonra bu yardımcı olmuyor, sonuçta!!!

BTW. Size neyi başarmaya çalıştıklarını söyleyeceğim:

Mümkün olduğu kadar çok insanın kodlarla uğraşmasını engellemek istiyorlar.

Olabildiğince ticari olmalı.

Yakın zamana kadar, hemen hemen herkes basit mql4 ile uğraşabiliyordu.

Şimdi amaç her şeyi ticarileştirmek!

 
Dadas :

Bu B646 ciddi şekilde tıkanmış!
Öyle olabilir, ancak genel başlatma başarısız oldu, nesnelerin bağlantı noktaları hakkındaki bu tartışmayla ilgisi olmayan belirli bir hata.
 
ProfessorMetal :


onların yeni OnCalculate() yöntemi bana hiçbir anlam ifade etmiyor. Bana öyle geliyor ki, ihtiyacınız olduğunda kendiniz için yapacağınız bir yük bilgisini gereksiz yere hesaplayıp vermek ve ihtiyacınız olmayan şeylerle uğraşmayarak kendinize hesaplama süresinden tasarruf etmek gibi geliyor. Bununla neyi başarmaya çalıştıklarından emin değilim.

Mutlu Kodlama!

OnCalculate, gösterge tarafından halihazırda kaç çubuğun işlendiğini hesaplamanın sonucunu sağlar. Eski IndicatorCounted işlevinin yerini alır. Aynı zamanda mql5 ile uyumluluğu da sağlar, çünkü dizi dizileri, global dizi dizilerini kullanmanın eski mql4 yöntemine kıyasla kendisine referans olarak iletilir. Kodlama açısından çok az fark vardır.

 

Bir kez daha, rica ederim Dadalar. Bazı eşyalarımda kullanmama rağmen ANCHOR özelliklerini kullanmayı unutmuştum.

SDC, bilgi için teşekkürler. Belgeler amacını gerçekten açıklamıyor. Rusçadan İngilizceye çeviride anlamın kaybolmuş olabileceğinden şüpheleniyorum. Şimdi daha mantıklı. OnStart() yerine kullanılması amaçlanmadığını, bunun yerine IndicatorCounted() yerine kullanıldığını varsayıyorum. DocumentCounted()'ın OnCalculate() ile değiştirilmesini gösteren bir tür "önce" ve "sonra" gösteren bir örnek sağlamak belgelere iyi bir ek olacaktır. Geri dönüp açıklamanız ışığında belgeleri gözden geçirmem ve parçaların nasıl bir araya geldiğini görmem gerekecek. Tekrar teşekkürler.

Prof.

 

int start() yerine int OnCalculate() kullanırsınız. start() gibi her kene üzerinde çalışır. Bir öncesi ve sonrası şöyle görünürdü,

 int start()
  {
   int i= 0 , limit= 0;
   int counted_bars= IndicatorCounted ();
//---- check for possible errors
   if (counted_bars < 0 ) return (- 1 );
//----
   limit = Bars -counted_bars- 1 ;
   for (i = limit; i >= 0 ; i--)
   {
//---- indicator calculations
   }
   return ( 0 );
  }

//--------------------------------------------------
//--------------------------------------------------

int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long & tick_volume[],
                 const long & volume[],
                 const int & spread[])
  {
   int i= 0 , limit= 0 ;
//--- check for possible errors
   if (prev_calculated < 0 ) return (- 1 );
//---
   limit = rates_total-prev_calculated;
   for (i = limit; i >= 0 ; i--)
   {
//--- indicator calculations
   }
    return (rates_total);
  }

OnCalculate'in biçimsel parametreleri onu daha fazla kendi içinde barındırır, kodlayıcı, görünüşe göre oop çevrelerinde kötü kötü kodlayıcı, bileğe tokat gibi her türlü globali çağırmaya güvenmek zorunda değildir. Pratikte, ikisini de kullanmak arasında pek bir fark yoktur. Ayrıca OnCalculate, mql5 ile aynıdır, dolayısıyla uyumlu kod yazma seçeneğiniz vardır.