Göstergem, yeni zaman çerçevesi grafiğine geçtiğimde kayboluyor - sayfa 2

 

Açıklamanız için teşekkürler.

Şimdi daha iyi görüyorum.

SCFX

 

Merhaba,

Bu çılgın hatayla kafamı kaşıdım.

Yine de zaman dilimini değiştirdiğimde 4 satırlık kodun bu basit göstergesi kayboluyor.

Çılgınca, burada yayınlanan önerileri zaten uyguladım ama yine de başarısız oldum.

Ben çok kötü hissediyorum...

Lütfen bana yardım et.

Çok teşekkürler,

SCFX

 //+------------------------------------------------------------------+
//|                                                        H_roc.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link       "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//#property indicator_minimum -3.5
//#property indicator_maximum 3.5
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1   "boring"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1   1
//--- input parameters
//--- indicator buffers
double          boring[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,boring);
   
          
//---
   return (INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 limit=rates_total-prev_calculated;
   if (limit<= 0 ) limit= 300 ;
//---
 
 for ( int i= 1 ;i<=limit  ;i++)
{   if (   MathAbs (Close[i]-Open[i])/(High[i]-Low[i])< 0.50
     ) 
      boring[i]=Close[i];
    
}  
   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
scfx :

Merhaba,

Bu çılgın hatayla kafamı kaşıdım.

Yine de zaman dilimini değiştirdiğimde 4 satırlık kodun bu basit göstergesi kayboluyor.

Çılgınca, burada yayınlanan önerileri zaten uyguladım ama yine de başarısız oldum.

Ben çok kötü hissediyorum...

Lütfen bana yardım et.

Çok teşekkürler,

SCFX



2014.06.15 11:26:39.908 'test.mq4'te sıfır bölme (59,44)
 
angevoyageur :
2014.06.15 11:26:39.908 'test.mq4'te sıfır bölme (59,44)


Cevabınız için teşekkürler.

Benim günlüğümde böyle bir uyarı yok ama TF değiştirdiğimde bu gösterge kalkıyor.

Henüz düzeltemiyorum.

SCFX

2014.05.18 08:41:31.080 Özel gösterge H_889_boring GBPUSD,H1: kaldırıldı
2014.05.18 08:41:25.441 Özel gösterge H_889_boring GBPUSD,H4: başarıyla yüklendi

 
scfx :

Henüz düzeltemiyorum.

SCFX

Bunun nedeni çok fazla çabalamamanızdır.

Başkalarının sizin için yapmasını sağlarsanız hiçbir şey öğrenemezsiniz, tek yol bunu kendiniz yapmaktır, böylece anlarsınız, bunu kendiniz yapmanın tek yolu her bir kod satırını incelemek, parçalamak ve çözmektir. tam olarak ne yapıyor ve bunu yapmanın birkaç yolu var.

 for ( int i= 1 ;i<=limit  ;i++)
{   if (   MathAbs (Close[i]-Open[i])/(High[i]-Low[i])< 0.50
     ) // what is this parentheses doing here ? How can you expect to write code that works if you are this sloppy about it ?
      boring[i]=Close[i];
    
}  

Bunlar, sorunun nedenini bulmanıza yardımcı olacak yapabileceğiniz şeylerdir.

  • Dergi sekmesine baktığını söyledin, yanındaki uzmanlar sekmesine baktın mı?
  • Geçen hafta size kodunun dizi aralığının dışına çıkmasına neden olduğunu söylemiştim, bunun ne anlama geldiğini öğrenmek için buna baktınız mı?
  • Meta düzenleyicide, kodunuzda hata ayıklamak için onu nasıl kullanacağınızı öğrenmeyi deneyebileceğiniz bir hata ayıklayıcı var.
  • Kod çalışırken değişkenlerinizin değerlerinin ne olduğunu kontrol edebilmek için Print() işlevini kullanabilirsiniz.

Uzmanlar sekmesine tıklamış olsaydınız, göstergenizin bu satırda sıfır bölme yaptığını, değişen zaman dilimlerinin bununla hiçbir ilgisi olmadığını söylerdi.

 if (   MathAbs (Close[i]-Open[i])/(High[i]-Low[i])< 0.50

Bu, bu Yüksek[i]-Düşük[i]'nin bir nedenden dolayı sıfır olduğu anlamına gelmelidir. Grafikteki göstergeye bakarsanız, göstergenin bazı değerlerini çizdiğini ve ardından yalnızca bir işaretin olduğu bir çubukta durduğunu görebilirsiniz. Yalnızca bir onay işareti varsa yüksek[i] == düşük[i] bu, sıfır bölmeye neden olur

Şimdi yüksek[i]-düşük[i] sıfır ise kullanılmadığından emin olun.

   int limit=rates_total-prev_calculated;
   if (limit<= 0 ) limit= 300 ;
//---
   for ( int i= 1 ;i<=limit  ;i++)
   {
     if (High[i] - Low[i] == 0 ) continue ; // --------------- skip this bar
    
     if ( MathAbs (Close[i]-Open[i])/(High[i]-Low[i])< 0.50 ) 
    {boring[i]=Close[i];
   }}
//--- return value of prev_calculated for next call
   return (rates_total);
  }

Şimdi, uzmanlar sekmesinin size kodun artık sıfır bölmediğini, ancak bu satırda dizi aralık dışı hatası ürettiğini söylediğini göreceksiniz.

 if (high[i] - low[i] == 0 )  

Peki, döngüyü test etmek için tüm hesaplamaları ve koşulları çıkarırsanız ne olur?

   int limit=rates_total-prev_calculated;
   if (limit<= 0 ) limit= 300 ;
//---

   for ( int i= 1 ;i<=limit  ;i++)
   { 
    boring[i]=Close[i];
   }
//--- return value of prev_calculated for next call
   return (rates_total);
  }

Şimdi uzmanlar sekmesi raporları yine aralık dışında, bu sefer bu satırda:

boring[i]=Close[i];

Artık, döngüde bir fiyat dizisi her kullanıldığında kodunuzun dizi aralığının dışına çıkmasına neden olduğunu biliyorsunuz. Öyleyse döngüde neyin yanlış olduğunu ve Close[i], Low[i], High[i]'nin neden aralık dışında olduğunu anlayın. Göstergenin grafiğin sonuna kadar çizdiğini görebilirsiniz, bu nedenle hata sonunda, en yüksek dizi dizinlerinde olmalıdır.

   int limit=rates_total-prev_calculated; // what is the value of limit in this calculation when prev_calulated == 0 ?
   if (limit<= 0 ) limit= 300 ;
//---

   for ( int i= 1 ;i<=limit;i++) // how does the value of limit compare with the highest available Close[] array index ?

İlk önce doğru çalışan bir döngünün nasıl kodlanacağını öğrenmeden bir gösterge oluşturmaya çalışıyorsunuz. Bunun nasıl yapılacağına dair birçok örnek var. Dahil edilen göstergelerin koduna bakın ve tam olarak nasıl çalıştıklarını anlayana kadar onlarla deney yapın, ardından hesaplamaları gerçekleştirmeye çalışmadan önce düzgün çalışan basit bir tek çizgi çizmek için bir gösterge oluşturmaya çalışın.
 

@ scfx

Düzeltebilecek tek kişi sensin. Veya https://www.mql5.com/en/job adresine gidin.

ve işi orada yayınlayın.

 
SDC :
...

Lütfen SDC, haklı olsanız bile bu kadar sert olmanıza gerek yok.
 
angevoyageur :

Lütfen SDC, haklı olsanız bile bu kadar sert olmanıza gerek yok.

lol yazımı biraz değiştirdim ;)

 

Üzgünüm, sizi yanlış yönlendirdim, özür dilerim, gösterge şu şekilde kodlanabilir:

 int limit = - 1 ;
   if ( prev_calculated == 0 ) limit =  rates_total - 3000 ; // will calculate 3000 Bars
   if ( prev_calculated > 0 )   limit = rates_total-prev_calculated;

 for ( int i= limit; i>=0; i--)
   {
     if (High[i] - Low[i] == 0 ) continue ; // --------------- skip this bar
    

// Please test it, check if it's OK;
// Put the indicator in a backtest EA, say MACDSample, to check it
 

Grafikte 3000'den az çubuk varsa, yine de aralık dışında olacaktır.