Gösterge Sorusu

 

Herkese selam,

Forumlarda gurulardan büyük yardım alarak iFractals içeren bir kod tabanlı göstergeden diziler hakkında bazı genel konular öğreniyordum.


her neyse

Göstergeye ekleme işlevi eklemek için koşullu işleçler veya mantıksal işlemler ekleyemedim

 //+------------------------------------------------------------------+
//|                                   
//+------------------------------------------------------------------+


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[ 1000 ];
double v2[ 1000 ];
double v3[ 1000 ];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers ( 3 );

   SetIndexArrow ( 0 , 111 );
   SetIndexStyle ( 0 , DRAW_ARROW , STYLE_DOT , 1 , Blue );
   SetIndexBuffer ( 0 , v1);
   SetIndexLabel ( 0 , "Resistance" );
   

   SetIndexArrow ( 1 , 111 );
   SetIndexStyle ( 1 , DRAW_ARROW , STYLE_DOT , 1 , Red );
   SetIndexBuffer ( 1 , v2);
   SetIndexLabel ( 1 , "Support" );
  
   
   SetIndexArrow ( 2 , 111 );
   SetIndexStyle ( 2 , DRAW_ARROW , STYLE_DOT , 1 , White );
   SetIndexBuffer ( 2 , v3);
   SetIndexLabel ( 2 , "High A" );
   
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double    faster = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_MAIN, 1 ), //MODE_MAIN
            slower = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_SIGNAL, 1 ); //MODE_SIGNAL
           
            
   int i= Bars ;
//----
  
     for (i= Bars ; i>= 0 ; i--)
     {
      val1= iFractals ( NULL , 0 , MODE_UPPER,i);
       if (val1 > 0 )
         {        
          v1[i]=High[i]; 
                         
           Print ( "v1[" , i, "]= " , v1[i], " if" );
          }    
               
       else           
         {
         //v1[i]=v1[i+1];
         //Print ("v1[", i, "]= ", v1[i], " else");
         }
      
      val2= iFractals ( NULL , 0 , MODE_LOWER,i);
       if (val2 > 0 )
         {
          v2[i]=Low[i];
          
           Print ( "v2[" , i, "]= " , v2[i], " if" );
         }
          
       else           
         {
         //v2[i]=v2[i+1]; 
         //Print ("v2[", i, "]= ", v2[i], " else");         
         }
      }

   
     
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+

Bu fikirle oynamak için if(hızlı > daha yavaş) kodunun çeşitli alanlarına eklemeyi denedim. Normalde bu fikirler bir EA'da işe yarar ancak bir göstergede çalışmaz.

IE if(v1 > 0 && daha hızlı > daha yavaş)

ancak bu göstergenin kaybolmasına neden olur.

İstenen göstergeyi üretmesi gerektiğini düşündüğüm diğer birçok kombinasyon if(diğer koşullar) vb.
Hepsi hiçbir print deyimi çıktısı üretmez.

Burada hangi noktayı kaçırıyorum.

Tavsiye lütfen
teşekkürler

 

double v1[1000];
double v2[1000];
double v3[1000];<------ leave out the '1000' initialization for indicator buffers, as they don't require 

 
diostar :


Pekala, bunu ilk başta yaptım ama sonra yapmak istediğim tamponun değerlerini yazdıramadım.

Peki bekle, şunu yeniden ifade edeyim:

Arabellekteki öğelerin sayısını bildirmezsem, gösterge v1[i]=Yüksek[i] ile olduğu gibi çalışacaktır.
Ama Yazdır (v1[i]); çıktı almayacak çünkü söyleyebileceğim kadarıyla, eleman sayısı bildirilmediyse bildirilmeyen dizi değerlerini yazdırmanın bir yolu yok, bu nedenle her zaman 0 yazdıracak

Bu nedenle, genel olarak ilan etmezsem, gösterge çalışır, ancak if(daha hızlı> daha yavaş) yine de göstergeyi ortadan kaldırır ve değerleri de yazdıramıyorum.

Bunu bildirir ve ayrıca v1[i]=High[i] ile yeniden başlatırsam, yazdırabilirim, ancak && daha hızlı > daha yavaş gibi eklemeler göstergeyi yeniden kaldıracaktır .

Nedenini tam olarak anlamıyorum.

teşekkürler
 

Kodunuzu aldım, arabellek bildirimlerinden değerleri çıkardım ve gayet iyi çalışıyor. . .

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 ise
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 ise
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 ise
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 ise
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996 ise
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 ise
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 ise


 
RaptorUK :

Kodunuzu aldım, arabellek bildirimlerinden değerleri çıkardım ve gayet iyi çalışıyor. . .

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 <----Yüksek ise

------> şu anda Fraktallar tutarsız Yüksek önceki Düşük <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 <----Düşük ise

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 eğer<----Yüksek

------> şu anda Fraktallar tutarsız Yüksek önceki Düşük <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 ise<----Düşük

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996 eğer<----Yüksek

------> şu anda değişken Fraktallar tutarlı <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 <----Düşük ise
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 eğer <----Yüksek


İlginç, sonuç için teşekkürler Ajan86V2. Fraktallar gerçekten de merak uyandıranlardan biridir, ancak ticaret yapmak için karlı bir yol olabilir.

 
RaptorUK :

Kodunuzu aldım, arabellek bildirimlerinden değerleri çıkardım ve gayet iyi çalışıyor. . .

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 ise
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 ise
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 ise
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992 ise
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996 ise
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 ise
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 ise


Kodu, diğer iş parçacığında olmayan sıfır değerleri üretmeden de yazdırabilirim.
Üzgünüm, anlamıyorum. Yaptığımı düşündüm, ama hala bir şeyleri kaçırıyor gibiyim.

 int start()
   {
   double test[];
   
   test[ 39 ] = 45.6 ;
   Print ( "test[39]= " ,test[ 39 ] );
   

       return ( 0 );
   }
Bana yukarıdaki gibi beyan etmemi söyledin:

Ve bu konuyu alıntıladın:

Diziler Hakkındaki Kitabı okuduğunuzda, bunun nerede yazdığını gördünüz mü?

"Bir diziyi bildirirken, veri türü, dizi adı ve her boyutun eleman sayısı belirtilmelidir:"

Yani bir yandan, önce double test[40] bildirmeden diziyi bu komut dosyasındaki gibi yazdıramıyorum; talimat verdiğiniz gibi, ancak şimdi bildirim olmadan da yazdırabiliyorum.

Öyle görünüyor ki, bildirimden bağımsız olarak arabellekteki değerleri yazdırabilirim.

Ancak, if(hızlı > daha yavaş) veya && daha hızlı > daha yavaş gibi normalde istenen sonucu üretecek ek koşullar ekleyemiyorum
EMA olabilir, neden çalışmadığını anlamak istiyorum.
Gösterge yüksek değerlerinin kaybolmasına neden olur ve v1 yazdırma çıktısı yazdırmayı durdurur. Koşulla uyumlu olmasını ve çıktıyı yazdırmasını bekliyordum.

Bunun için de aynı sonuçlarla ek kod blokları eklemeye çalıştım.

teşekkürler
 

Bunu da yazdım. . .

RaptorUK :

Gösterge arabellekleri özel Dizilerdir. . . Dizileri ve Tamponları karıştırmayın, benzer ancak farklıdırlar.

Orijinal kodda v1[] ve v2[] arabelleklerdir, en son kodunuzda bunlar Dizilerdir, bir Dizi bildirdiğinizde ona bir boyut vermeniz gerekir, örneğin v1[50], v1[0]'dan 50 öğeye sahiptir. v1'e[49]. Arabellek, ihtiyaç duyulan daha fazla öğe olduğunda otomatik olarak Yeniden Boyutlandırılır ve değerler, Tamponda otomatik olarak değişir. Şu anda oluşan çubuk 0'ı düşünün, bu çubuk o çubukla ilişkili bir Gösterge değerini tamamladığında indeks 1'e kaydırmak zorundadır. . . bu, Buffers ile otomatik olarak yapılır. . Arrays ile benzer bir şey istiyorsanız yapabilirsiniz, ancak bunu kendiniz kodlamanız gerekir.

 
Agent86 :

Ancak, if(hızlı > daha yavaş) veya && daha hızlı > daha yavaş gibi normalde istenen sonucu üretecek ek koşullar ekleyemiyorum
EMA olabilir, neden çalışmadığını anlamak istiyorum.
Gösterge yüksek değerlerinin kaybolmasına neden olur ve v1 yazdırma çıktısı yazdırmayı durdurur. Koşulla uyumlu olmasını ve çıktıyı yazdırmasını bekliyordum.

Bunun için de aynı sonuçlarla ek kod blokları eklemeye çalıştım.

teşekkürler

Kodunuzu, çalışmayan şeyleri gösterin. . . Teknik Göstergeler kullanmıyorum. . . hiç, bu yüzden EMA'lar, vb. ile ne demek istediğinizi bildiğimi varsaymayın ;-) bana kodunuzu göstermeniz gerekiyor.
 
RaptorUK :

Bunu da yazdım. . .

Raptorİngiltere :

Gösterge arabellekleri özel Dizilerdir. . . Dizileri ve Tamponları karıştırmayın, benzer ancak farklıdırlar.

Orijinal kodda v1[] ve v2[] arabelleklerdir, en son kodunuzda bunlar Dizilerdir, bir Dizi bildirdiğinizde ona bir boyut vermeniz gerekir, örneğin v1[50], v1[0]'dan 50 öğeye sahiptir. v1'e[49]. Arabellek, ihtiyaç duyulan daha fazla öğe olduğunda otomatik olarak Yeniden Boyutlandırılır ve değerler, Tamponda otomatik olarak değişir. Şu anda oluşan çubuk 0'ı düşünün, bu çubuk o çubukla ilişkili bir Gösterge değerini tamamladığında indeks 1'e kaydırmak zorundadır. . . bu, Buffers ile otomatik olarak yapılır. . Arrays ile benzer bir şey istiyorsanız yapabilirsiniz, ancak bunu kendiniz kodlamanız gerekir.

Doğru. "Benzer ama farklı". Bundan daha iyi söylemenin başka bir yolunu göremiyorum.
 
Tamam, benzer ama farklı anladım, başlangıçta kodun herhangi bir noktasında v1[i] yazdırırken bile büyük sorunlar yaşadım, ancak şimdi başlangıçta beklediğim gibi yazdırıyor gibi görünüyor.
İlk gösterge döngüsünde yazdıramadığım için yalnızca ikincil bir döngü oluşturdum, ancak şimdi yazdırıyor
Her neyse, bunu tekrar etmeyeceğim, sanırım anladım.

Bu nedenle, çalışmayacak kod burada gösterilen bazı örneklerdir:

 //+------------------------------------------------------------------+
//|                                   
//+------------------------------------------------------------------+


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[];
double v2[];
double v3[];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers ( 3 );

   SetIndexArrow ( 0 , 111 );
   SetIndexStyle ( 0 , DRAW_ARROW , STYLE_DOT , 1 , Blue );
   SetIndexBuffer ( 0 , v1);
   SetIndexLabel ( 0 , "Resistance" );
   

   SetIndexArrow ( 1 , 111 );
   SetIndexStyle ( 1 , DRAW_ARROW , STYLE_DOT , 1 , Red );
   SetIndexBuffer ( 1 , v2);
   SetIndexLabel ( 1 , "Support" );
  
   
   SetIndexArrow ( 2 , 111 );
   SetIndexStyle ( 2 , DRAW_ARROW , STYLE_DOT , 1 , White );
   SetIndexBuffer ( 2 , v3);
   SetIndexLabel ( 2 , "High A" );
   
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double    faster = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_MAIN, 1 ), //MODE_MAIN
            slower = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_SIGNAL, 1 ); //MODE_SIGNAL
           
            
   int i= Bars ;
//----
  
     for (i= Bars ; i>= 0 ; i--)
     {
      val1= iFractals ( NULL , 0 , MODE_UPPER,i);
       if (val1 > 0 && faster > slower) 
         // I think I need to add some more comparisons for the Low[i] also
         // the comparison works but shows indicator when faster < slower too.
         // adding additional code blocks instead of above and including the part below and inserting this instead 
         //                                               if(faster>slower)
         //                                                     {
         //                                                      v1[i]=High[i];
         //                                                     }
         //                                                      causes indicator to disappear
         
         {                             
          v1[i]=High[i]; 
                         
           Print ( "v1[" , i, "]= " , v1[i], " if" );
          }    
               
       else           
         {
         //v1[i]=v1[i+1];
         //Print ("v1[", i, "]= ", v1[i], " else");
         }
      
      val2= iFractals ( NULL , 0 , MODE_LOWER,i);
       if (val2 > 0 )
         {
          v2[i]=Low[i];
          
           Print ( "v2[" , i, "]= " , v2[i], " if" );
         }
          
       else           
         {
         //v2[i]=v2[i+1]; 
         //Print ("v2[", i, "]= ", v2[i], " else");         
         }
      }

   
     
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+

teşekkürler

 
Agent86 :

Yani çalışmayacak kod burada gösterilen bazı örneklerdir:

teşekkürler

Tamam, sana sorununun ne olduğunu söyleyebilirim veya sana bazı ipuçları verebilirim. . . . önce ipuçları, söylememi istiyorsan söylemen yeterli. .

Döngünün içinde, for (i= Bars ; i>= 0 ; i--) . . daha hızlı ve daha yavaş için değerler nelerdir?