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

 

Merhaba,

Bir gösterge ile başlıyorum (İLK BÖLÜM). Zaman çerçevesini değiştirirken iyi çalışıyor.

Sonra İkinci Parçayı ekliyorum: Kapat[i]-Kapat[i+1], son 100 bar fark değerinin medyanından küçükse, tüm tamponlara 0 değeri atayacağım.

Şimdi birleşik gösterge 1 grafikte iyi çalışıyor ancak zaman çerçevesini değiştirdiğimde bu gösterge kayboluyor. Onu grafiğe yeniden eklemem gerekiyor.

Sorunun Array'den kaynaklandığını düşünüyorum ama nasıl düzelteceğimi bilmiyorum.

Hata konusunda bana yardımcı olabilecek var mı?

Çok teşekkür ederim.

SCFX

 //+------------------------------------------------------------------+
//|                                                          hf1.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              httakeprofit://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link       "httakeprofit://www.mql5.com"
#property version   "1.00"
#property strict

//--- indicator settings
//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_width1 2   
#property indicator_width2 2 
#property indicator_width3 1 
#property indicator_width4 1 
#property indicator_width5 1 

#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_color4 Orange
#property indicator_color5 Orange

//--- input parameter
input int kperiod= 30 ;
input int dperiod= 9 ;
input int slow= 9 ;
input int sample_roc_quartile= 100 ;

//--- buffers
double buy[];
double sell[];
double stoploss[];
double takeprofit1[];
double takeprofit2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ( void ) //*/*/*/*/*/
  {
//--- indicator buffers mapping
//--- 1 additional buffer used for counting.
   //IndicatorBuffers(6);
   IndicatorDigits( Digits );
//--- indicator line
   SetIndexStyle( 0 , DRAW_ARROW );
   SetIndexBuffer ( 0 ,buy);
   SetIndexArrow( 0 , 241 );
   
   SetIndexStyle( 1 , DRAW_ARROW );
   SetIndexBuffer ( 1 ,sell);
   SetIndexArrow( 1 , 242 );

   SetIndexStyle( 2 , DRAW_ARROW );
   SetIndexBuffer ( 2 ,stoploss);

   SetIndexStyle( 3 , DRAW_ARROW );
   SetIndexBuffer ( 3 ,takeprofit2); 
         
   SetIndexStyle( 4 , DRAW_ARROW );
   SetIndexBuffer ( 4 ,takeprofit1);  
   
  
//--- name for DataWindow and indicator subwindow label

//---
   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;
      
       double roc_s[];
       ArrayResize (roc_s,sample_roc_quartile+ 1 );

//---

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

for ( int i= 0 ; i<limit; i++)
{  

//FIRST PSART 

   if ( iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 0 ,i)> iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 1 ,i)   &&   iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 0 ,i+ 1 )< iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 1 ,i+ 1 ))   
      {  buy[i]=Close[i]; 
         stoploss[i]=Low[i]- 0.005 ; 
         takeprofit1[i]=Close[i]+ 0.005 ;
         takeprofit2[i]=Close[i]+ 0.01 ;
         }
      
   if ( iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 0 ,i)< iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 1 ,i)   &&   iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 0 ,i+ 1 )> iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 1 ,i+ 1 ))   
      {  sell[i]=Close[i]; 
         stoploss[i]=High[i]; 
         takeprofit1[i]=Close[i]- 0.0050 ;
         takeprofit2[i]=Close[i]- 0.01 ;
         }   
         
//SECOND PART         
   for ( int j= 0 ;j<=sample_roc_quartile;j++)
   {
      roc_s[j]=Close[i+j]-Close[i+j+ 1 ];
       ArraySort (roc_s);
      
       if (   (Close[i]-Close[i+ 1 ])<roc_s[ 50 ]  )
         {  buy[i]= 0 ; 
            stoploss[i]= 0 ; 
            takeprofit1[i]= 0 ;
            takeprofit2[i]= 0 ;
         }
    }     
}
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 

Muhtemelen bir dizi aralık dışı hatası ve gösterge kaldırılıyor

 int limit=rates_total-prev_calculated;

 for ( int i= 0 ; i<limit; i++)
 iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 0 , i+ 1 )< iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 1 , i+ 1 ))

Günlükte küresel bir başlatma hatasıyla ilgili bir mesaj alıyorsunuzdur.
Günlüklerinizi kontrol edin

 

Öneriniz için teşekkür ederiz.

Günlüğü kontrol ediyorum, hata veya uyarı bildirimi yok.

(i+1)'in tek başına durduğundan (veya sadece İkinci bölümü silerek) sorun yarattığından emin değilim, bu gösterge iyi çalışıyor.

SCFX

 

Kodunuzu derleyip test ettiğim hatalar var:

2014.05.22 22:39:43.936 Özel gösterge Test Göstergesi 3 XAUUSD,M1: kaldırıldı
2014.05.22 22:39:43.905 Test Göstergesi 3 XAUUSD,M1: genel başlatma başarısız
2014.05.22 22:39:43.905 Test Göstergesi 3 XAUUSD,M5: uninit sebep 3 //----------------------- değişim tablosu
2014.05.22 22:39:17.323 dizi 'Test Göstergesi 3.mq4' içinde aralık dışında (117,32)
2014.05.22 22:39:15.591 Test Göstergesi 3 XAUUSD,M5: başlatıldı
2014.05.22 22:39:09.570 Özel gösterge Test Göstergesi 3 XAUUSD,M5: başarıyla yüklendi

 
scfx :

Öneriniz için teşekkür ederiz.

Günlüğü kontrol ediyorum, hata veya uyarı bildirimi yok.

(i+1)'in tek başına durduğundan (veya sadece İkinci bölümü sildiğimden) sorun yarattığından emin değilim, bu gösterge iyi çalışıyor.

SCFX


O zaman muhtemelen bu

roc_s[j]=Close[ i+j ]-Close[ i+j+ 1 ];

Var olmayan barların kapanış fiyatını almaya çalışıyorsunuz

 

Gösterge ilk başladığında bir satır eklemelisiniz: prev_calculated == 0,

bunun gibi bir şey :

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

bilgisayarımda da hata yok ;-)

 

Merhaba ffoorr,

Çözümünüz gerçekten çok iyi.

Gerçeği söylemek gerekirse, dün gece tamir etmesi için birini tuttum. Evet yaptı ama kod verimsiz, lütfen aşağıya bakın, çünkü (i) için bir tane daha ekledi.

prev_calculated ==0 ile ne anlama geldiğini açıklarsanız sevinirim. anlamıyorum.

 //+------------------------------------------------------------------+
//|                                                          hf1.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              httakeprofit://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link       "httakeprofit://www.mql5.com"
#property version   "1.00"
#property strict

//--- indicator settings
//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_width1 2   
#property indicator_width2 2 
#property indicator_width3 1 
#property indicator_width4 1 
#property indicator_width5 1 

#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Red
#property indicator_color4 Orange
#property indicator_color5 Orange

//--- input parameter
input int kperiod= 30 ;
input int dperiod= 9 ;
input int slow= 9 ;
input int sample_roc_quartile= 100 ;

//--- buffers
double buy[];
double sell[];
double stoploss[];
double takeprofit1[];
double takeprofit2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ( void ) //*/*/*/*/*/
  {
//--- indicator buffers mapping
//--- 1 additional buffer used for counting.
   //IndicatorBuffers(6);
   IndicatorDigits( Digits );
//--- indicator line
   SetIndexStyle( 0 , DRAW_ARROW );
   SetIndexBuffer ( 0 ,buy);
   SetIndexArrow( 0 , 241 );
   
   SetIndexStyle( 1 , DRAW_ARROW );
   SetIndexBuffer ( 1 ,sell);
   SetIndexArrow( 1 , 242 );

   SetIndexStyle( 2 , DRAW_ARROW );
   SetIndexBuffer ( 2 ,stoploss);

   SetIndexStyle( 3 , DRAW_ARROW );
   SetIndexBuffer ( 3 ,takeprofit2); 
         
   SetIndexStyle( 4 , DRAW_ARROW );
   SetIndexBuffer ( 4 ,takeprofit1);  
   
  
//--- name for DataWindow and indicator subwindow label

//---
   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 = 2 ;
     
       double roc_s[];
       ArrayResize (roc_s,sample_roc_quartile+ 1 );

//---

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

for ( int i= 1 ; i<limit; i++)
{  

//FIRST PSART 

   if ( iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 0 ,i)> iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 1 ,i)   
   &&   iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 0 ,i+ 1 )< iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 1 ,i+ 1 ))   
      {  buy[i]=Close[i]; 
         stoploss[i]=Low[i]- 0.005 ; 
         takeprofit1[i]=Close[i]+ 0.005 ;
         takeprofit2[i]=Close[i]+ 0.01 ;
         }
      
   if ( iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 0 ,i)< iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 1 ,i)   
   &&   iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 0 ,i+ 1 )> iStochastic ( NULL , 0 ,kperiod,dperiod,slow, 0 , 0 , 1 ,i+ 1 ))   
      {  sell[i]=Close[i]; 
         stoploss[i]=High[i]; 
         takeprofit1[i]=Close[i]- 0.0050 ;
         takeprofit2[i]=Close[i]- 0.01 ;
         }   
} 

    
//SECOND PART   

//--------------------------------------- HERE IS THE WHAT HE DID
int mid = (sample_roc_quartile + 1 )/ 2 ;
  
for ( int i= 1 ; i<limit&&(i+ 1 )<rates_total; i++)
{    

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


   for ( int j= 0 ;j<=sample_roc_quartile&&(i+j+ 1 )<rates_total;j++)
   {
      roc_s[j]=Close[i+j]-Close[i+j+ 1 ];
       ArraySort (roc_s);
   }   
      
       if ( (Close[i]-Close[i+ 1 ])<roc_s[mid]  )
         {  buy[i]= 0 ; 
            stoploss[i]= 0 ; 
            takeprofit1[i]= 0 ;
            takeprofit2[i]= 0 ;
         }
    
 }    

//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 

Herkese selam...


IBFX MACD geleneksel göstergesini ve diğer şablonları MT4'üme yüklerken sorun yaşıyorum.

Önceki sürümde, dosyalarımı yalnızca "uzman" klasöründe bulunan "gösterge" klasörüne kopyalayıp yapıştırmam gerekecekti.

Mevcut olanın sadece ayrı bir "uzman" ve "indicator" klasöründen oluşan "MQL4" klasörü vardır.

Her iki klasöre de yapıştırmayı ve platformumu yeniden başlatmayı denedim ama işe yaramıyor

not edilmesi gerçekleşir.

Bu konu hakkında bana fikir verebilecek birileri var mı? veya belki de 2 EMA çizgili geleneksel MACD göstergesini almamın başka yolları var mı?

teşekkürler

douglas
 
douglas beng, kendi konularıyla ilgili olmadığında, sorunuzu başkalarının konularına koymayı bırakmanız gerekiyor. KENDİ KONUSUNA BAŞLAYIN.
 
douglas_heng : IBFX MACD geleneksel göstergesini ve diğer şablonları MT4'üme yüklerken sorun yaşıyorum.
Birden fazla (6) gönderi yapmayın . Başkalarının gönderilerini çalmayın.
 
scfx :

Merhaba ffoorr,

Çözümünüz gerçekten çok iyi.

Gerçeği söylemek gerekirse, dün gece tamir etmesi için birini tuttum. Evet yaptı ama kod verimsiz, lütfen aşağıya bakın, çünkü (i) için bir tane daha ekledi.

prev_calculated ==0 ile ne anlama geldiğini açıklayabilirseniz sevinirim. anlamıyorum.


peki scfx, göstergenizin ikinci bölümünü anlamıyorum, bu yüzden söyleyemem.

Bir gösterge ilk kez başlatıldığında, (bir çizelgeye koyun) önceki_hesaplama yapım yoluyla Sıfıra eşittir, bu nedenle göstergenin hesaplamaya başlayacağı başlangıç noktası sabitlenebilir.

if( önceki_hesaplanmış == 0) limit = 100;

veya

if( önceki_hesaplanmış < 50) limit = 500:

ya da söyle

if( prev_calculated < 500) limit = 3000: (hepsi aynı, grafiğin başlangıcı kullanılmaz)

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

at the first lauch of the indicator limit = 3000;

for ( int i= 1 ; i<3000; i++) // draw 3000 bars 

at the second lauch limit = 0; // ( because rates_total-prev_calculated = 0)  ;
for ( int i= 1 ; i<0; i++)    //   draw the last bars only, faster

çok iyi fikir bu indi ......