Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 600

 

Selamlar! :)

Yaklaşık olarak aşağıdaki gösterge kodu vardır:

 bool busy=false;

int start()
{
   int counted_bars= IndicatorCounted ();
   if (counted_bars< 0 ) return (- 1 );
   limit= Bars -counted_bars+ 1 ;
   limit= MathMin (bBars- 1 , limit);
   if ( IndicatorCounted ()> 0 ) limit= 1 ;
   
   FileWrite(han, TimeToStr ( TimeCurrent (), TIME_MINUTES | TIME_SECONDS ), Bars , IndicatorCounted ());
   FileFlush (han);
   //if(busy=false) return(0);
   for (i= 0 ; i<limit; i++)
   { 
      busy= true ;
       FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
       FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

M1 grafiğine atıyorum. Gösterge, sözde hesaplamaları gerçekleştirerek terminal ile birlikte asılı kalır.
15 dakika sonra zorla kapatıyorum, günlüğü açıyorum ve şunu görüyorum:

resim1

Göstergenin ilk kez hesaplayana kadar yeni gelen kenelere (mantıksal olarak) tepki vermediği ortaya çıktı. ANCAK! Oluştururken, terminale IndicatorConted()'in zaten 0'dan farklı bir değer atanması gerektiğini söylemeyi unutuyor.
Yani, bir yanlış hesaplama için sıraya giren yeni gelen kenelerin, IndicatorCounted()???

Meşgul değişkeni aracılığıyla kontrol etmeye çalıştı (yorumlanan satır - aynı sonuç).

Bu şekilde denedim:

 int start()
{
   FileWrite(han, TimeToStr ( TimeCurrent (), TIME_MINUTES | TIME_SECONDS ), Bars , IndicatorCounted ());
   FileFlush (han);
   return ( 0 );
   .
   .
   .
}

Doğal olarak, bu sefer her şey doğru çalıştı:

resim2

Ne oluyor? Sistemin IndicatorCounted() öğesine yeni bir değer yazmak için zamanı yok mu? Yani, uyku () gibi bir şey mi yapmanız gerekiyor? Göstergede imkansız olduğunu biliyorum)
Veya yeni bir tick geldiğinde, eskisi henüz hesaplamaları bitirmediği için IndicatorCounte()'nin hala sıfıra eşit olduğunu hatırlar ve zamanı geldiğinde IndicatourCounted()=0'ın eski değerine göre saymaya başlar. ?

Genel olarak, nasıl olunur? )

 
Expert :

Selamlar! :)

Yaklaşık olarak aşağıdaki gösterge kodu vardır:


Bu herşeyi açıklıyor. Bu kod gibi bir şeye, bu cevap gibi bir şeye ... ha ?
 
peace1984 :
Bu benim ilk deneyimim, kesinlikle yargılamayın :)
Dürüst olmak gerekirse, bana öyle geliyor ki, test eden kişi değişkenin geçmiş değerini - son testten - hatırlıyor. Nasıl - HZ, bilgi almak için çok az zaman var. Belki bir terminal hatası. Sadece koda bir yorum ekledim ve değerleri günlüğe çıkardım. Her yeni test çalıştırmasında, önceki testin değerinin sys değişkeninde depolandığı ortaya çıktı. Bir çeşit incir. Belki başkası görür, belki gözlerim bulanık...
Dosyalar:
11_1.mq4  8 kb
 
AlexeyVik :
Bu herşeyi açıklıyor. Bu kod gibi bir şeye, bu cevap gibi bir şeye ... ha ?


Mesele şu ki, kodun geri kalanı önemli değil. Hatanın özü bu parçada açıklanmıştır.
Genel olarak, insanları büyük bir gönderiyle korkutmaktan korktum. Ve böylece patlattı.

Kısaca şu şekilde formüle edilebilir: Göstergenin hesaplanması uzun bir süre için (bir dakikadan fazla) hesaplanırsa, IndicatorCounted() sürekli olarak 0 döndürür.

 
artmedia70 :
Dürüst olmak gerekirse, bana öyle geliyor ki, test eden kişi değişkenin geçmiş değerini - son testten - hatırlıyor. Nasıl - HZ, bilgi almak için çok az zaman var. Belki bir terminal hatası. Sadece koda bir yorum ekledim ve değerleri günlüğe çıkardım. Her yeni test çalıştırmasında, önceki testin değerinin sys değişkeninde depolandığı ortaya çıktı. Bir çeşit incir. Belki başkası görür, belki gözlerim bulanık...

Sadece satırı unuttun

 int        sys=(Sys< 0 )? 0 :Sys;

gösterge özellikleri tekrar çağrıldığında yürütülmez.

Tam olarak araştırmadım, ama belki istenen sonuç bu şekilde elde edilir?

 extern int Sys= 0 ;
int        sys;    // изменено
double     opb;
double     ops;
double     cb;
double     cs;
double     lot;
double     next_order;
int        i= 0 ;
int        x;
double     max;
double     min;
int        ticket;
int        tip;
int        count;
bool       res;
double     bal;
double     sl;
datetime   d;
double     N;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   sys=(Sys< 0 )? 0 :Sys;  // добавлено
   bal= AccountBalance ();
   return ( 0 );
  }
 
AlexeyVik :

Sadece satırı unuttun

gösterge özellikleri tekrar çağrıldığında yürütülmez.

Tam olarak araştırmadım, ama belki istenen sonuç bu şekilde elde edilir?



Temelde bir danışman. Ama HZ, deneyler için zaman yok. Yazdığım gibi tüm danışmanlarım var, çalışıyorlar. Bu saçmalığı test cihazında izlemek gerekli olacak. Zamanı geldiğinde.
 
Expert :


Mesele şu ki, kodun geri kalanı önemli değil. Hatanın özü bu parçada açıklanmıştır.
Genel olarak, insanları büyük bir gönderiyle korkutmaktan korktum. Ve böylece patlattı.

Kısaca şu şekilde formüle edilebilir: Göstergenin hesaplanması uzun bir süre için (bir dakikadan fazla) hesaplanırsa, IndicatorCounted() sürekli olarak 0 döndürür.


Evet, mesele bu değil. Kimsenin tam gizli kodunuza ihtiyacı yok. Sadece bu yanlış anlaşılmanın olacağı eksiksiz bir test kodu parçası yazın. Ve bu yüzden

 bool busy=false;

int start()
{
   int counted_bars= IndicatorCounted ();
   if (counted_bars< 0 ) return (- 1 );
   limit= Bars -counted_bars+ 1 ;
   limit= MathMin (bBars- 1 , limit);
   if ( IndicatorCounted ()> 0 ) limit= 1 ;
   
   FileWrite(han, TimeToStr ( TimeCurrent (), TIME_MINUTES | TIME_SECONDS ), Bars , IndicatorCounted ());
   FileFlush (han);
   //if(busy=false) return(0);
   for (i= 0 ; i<limit; i++)
   { 
      busy= true ;
       FileWrite(han, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), DoubleToStr(i, 0), DoubleToStr(IndicatorCounted(), 0));
       FileFlush(han);
      Здесь идут сложные вычисления которые занимают минуты 3
   }

   busy=false;
}

seçilen satırı zarem yaptığınızda??? Telepatlar yardım etmeyecek, sadece ölümlüler ve hatta daha fazlası ...

Daha sonra bu kısım

   int counted_bars= IndicatorCounted ();
   if (counted_bars< 0 ) return (- 1 );
   limit= Bars -counted_bars+ 1 ;
   limit= MathMin (bBars- 1 , limit);
   if ( IndicatorCounted ()> 0 ) limit= 1 ;

Hangi programcıdan geldiğini bilmiyorum ama burada bir şeyler çok yetersiz yazılmış... Size bir taş atılmamış. Sen de diğerleri gibi kodu aldın ve düzenlemeye çalıştın...

counted_bars değişkeni, son gösterge çağrısından bu yana değişmeyen çubukların sayısına eşitse (ilk satır)

if(counted_bars < 0) tarafından kontrol edilmesinin nasıl sıfırdan küçük olabileceğini asla anlayamayacağım...

Ayrıca, saçmalık, ama bunu çözmek için şimdiden tembelim ...

 
AlexeyVik :

Sadece satırı unuttun

gösterge özellikleri tekrar çağrıldığında yürütülmez.

Tam olarak araştırmadım, ama belki istenen sonuç bu şekilde elde edilir?




bunu denedim.. çalışmıyor..
 
artmedia70 :
Temelde bir danışman. Ama HZ, deneyler için zaman yok. Yazdığım gibi tüm danışmanlarım var, çalışıyorlar. Bu saçmalığı test cihazında izlemek gerekli olacak. Zamanı geldiğinde.

Evet, tabii ki danışman. Sonra başka bir soru ortaya çıkıyor, danışman neden grafikte bir bodrum göstergesi olarak göründü? Ancak özü değiştirmez, hem göstergeyi hem de danışmanı yeniden başlatırken, global düzeydeki değişkenler yeniden başlatılmaz ve satır int sys=(Sys<0)?0:Sys; gerçekleştirilmez.
 
peace1984 :

bunu denedim.. çalışmıyor..
Muhtemelen bu şekilde denemedi.
Kodu EA'larda yeniden derledim ve çalıştırdım. Bir yorumda Sys parametresini değiştirdiğinizde bu değer değişir.