Gösterge Sorusu - sayfa 3

 
Agent86 :
.

Her neyse, yüksek fraktalları yalnızca iMACD kesişmeleri veya EMA kesişmeleri veya diğer bazı gösterge kesişmeleri gibi başka bir koşul oluştuğunda oluşturmaya çalışıyordum.
Böylece fraktallar yalnızca tüm koşullar karşılandığında göstergede gösterilecektir.


Tam olarak ne yapmaya çalıştığınızdan emin değildim ama bunu deneyin, harici girdilere dikkat edin.

 #property indicator_chart_window      extern bool condition1 = true;
#property indicator_buffers 3          extern bool condition2 = true;
#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 bars = Bars ;
//----
  
   for ( int i=bars; i>= 0 ; i--)
    {
     if (condition1)
       {
        val1= iFractals ( NULL , 0 , MODE_UPPER,i);
         if (val1 > 0 ) v1[i]=High[i];       
       }   
     if (condition2)
       {      
        val2= iFractals ( NULL , 0 , MODE_LOWER,i);
         if (val2 > 0 ) v2[i]=Low[i];
       }
     }    
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
 
WHRoeder :
Bu sonuca tam olarak nasıl ulaştınız ve işlevsel fark nedir?

Bu sonuca vardım çünkü muhtemelen OOP perspektifinden bakıyordum. evet, bu MQL4 için geçerli değil, şimdi hatırlıyorum. İyi bir uygulama olsa da?

 

Ya da belki böyle bir şey?

gerçi gerçekten IndicatorCounted() kullanmalısınız , çünkü bunu böyle yaparsanız, göstergeniz tüm bu nesneleri bir kerede çizmek ve yeni çubuklar oluştukça yenilerini eklemek yerine her yeni tıklamada yeniden çiziyor.

 #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= 0 ;
   double    slower= 0 ;         
   int       bars = Bars ;
//----
  
   for ( int i=bars; i>= 0 ; i--)
    {
     faster = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_MAIN,i); //MODE_MAIN
     slower = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_SIGNAL,i); //MODE_SIGNAL
     val1= iFractals ( NULL , 0 , MODE_UPPER,i);
     val2= iFractals ( NULL , 0 , MODE_LOWER,i);
     
     if (faster > 0 )
      {
       if (val1 > 0 ) v1[i]=High[i];
      }
      
     if (faster < 0 )
      {
       if (val2 > 0 ) v2[i]=Low[i];
      }        
    }   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
 
diostar :
Bu sonuca vardım çünkü muhtemelen OOP perspektifinden bakıyordum. evet, bu MQL4 için geçerli değil, şimdi hatırlıyorum. İyi bir uygulama olsa da?

Kapsamı sınırlamak her zaman iyi bir uygulamadır. Değişkeni/nesneyi kullanıldığı yerde tanımlamak ve bunları bu noktada başlatmak her zaman iyi bir uygulamadır.

Döngünün dışında bir nesnenin tanımlanması, varsayılan bir yapı artı N ataması ile sonuçlanır. Döngü içinde tanımlanmış, değeri olan N yapıyla sonuçlanır - genellikle daha hızlı.

Değişikliğin bir fark yarattığını kanıtlayana kadar optimizasyonlar hakkında asla endişelenmeyin.

 
WHRoeder :

Kapsamı sınırlamak her zaman iyi bir uygulamadır. Değişkeni/nesneyi kullanıldığı yerde tanımlamak ve bunları bu noktada başlatmak her zaman iyi bir uygulamadır.

Döngünün dışında bir nesnenin tanımlanması, varsayılan bir yapı artı N ataması ile sonuçlanır. Döngü içinde tanımlanmış, değeri olan N yapıyla sonuçlanır - genellikle daha hızlı.

Değişikliğin bir fark yarattığını kanıtlayana kadar optimizasyonlar hakkında asla endişelenmeyin.

Bu, yineleyicisi için de geçerli olmalıdır. için (i nt i=0;...
 
diostar :
Bu, yineleyicisi için de geçerli olmalıdır. için (i nt i=0;...
Katılıyorum ama o kodu ben yazmadım.
 
Tamam, şimdi çalışan bir kodun bazı varyasyonlarına sahibim gibi görünüyor.

Her ne kadar, değişkenlerin (daha hızlı ve daha yavaş) döngü dışında bildirilmesinin neden döngü içinde uygunken iyi olmadığı konusunda biraz kafam karıştı.

Ve yine de int i = Barlar döngünün dışında mı yoksa döngünün içinde mi çalışacak?


Her neyse, üzerinde çalıştığım bazı fikirlerimin bu başlıkta zaten yayınlanmış olduğunu görmek güzel, bu yüzden bu iyi bir haber ve bir gün kendi başıma bir şeyler kodlayabilmeye biraz daha yaklaştığım anlamına geliyor. Bu yüzden biraz ilerleme, ilerlememekten daha iyidir. teşekkürler

Şimdi bazı gösterge zamanlarını karşılaştırmaya çalışabilirim, şimdi bunu çözmeye çalışacağım.

Gibi:
v1[i] ile v2[i] karşılaştırın Şu anda oluşturulmuş gösterge Times && / || if(v1[i] time is > v2[i] time) ve bunun gibi diğer karşılaştırmalar.

Tüm ipuçları için herkese teşekkürler, bu çok yardımcı oldu.
 
WHRoeder :

Kapsamı sınırlamak her zaman iyi bir uygulamadır. Değişkeni/nesneyi kullanıldığı yerde tanımlamak ve bunları bu noktada başlatmak her zaman iyi bir uygulamadır.

Döngünün dışında bir nesnenin tanımlanması, varsayılan bir yapı artı N ataması ile sonuçlanır. Döngü içinde tanımlanmış, değeri olan N yapıyla sonuçlanır - genellikle daha hızlı.

Değişikliğin bir fark yarattığını kanıtlayana kadar optimizasyonlar hakkında asla endişelenmeyin.

Bunun yalnızca göstergeler/ özel göstergeler için değil, herkes için doğru olduğunu varsayıyorum?
 
Agent86 :
Tamam, şimdi çalışan bir kodun bazı varyasyonlarına sahibim gibi görünüyor.

Her ne kadar, değişkenlerin (daha hızlı ve daha yavaş) döngü dışında bildirilmesinin neden döngü içinde uygunken iyi olmadığı konusunda biraz kafam karıştı.

Ve yine de int i = Barlar döngünün dışında mı yoksa döngünün içinde mi çalışacak?


Ne yaptığınızı düşünmelisiniz, bir gösterge oluşturduğunuzda, kodunuzu grafikteki her bir çubuğa uyguluyorsunuz, bu, bu tarihsel çubukların her biri için olduğu gibi macd gösterge değerini almanız gerektiği anlamına geliyor.

orijinal kodunuzda yaptığınız:

 double    faster = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_MAIN, 1 ), 
son parametre 1, grafiğin 1. Çubuğunda olduğu gibi macd'nin değeridir, mevcut çubuktan önceki çubuk, çubuk 0 olarak endekslenir

Açıkçası, tüm geçmiş grafiğin üzerinde koşullu operatörünüzde macd'nin bu tek değerini kullanmak istemezsiniz.

Macd'yi her çubukla aynı çubuk dizinine endekslemeniz gerekir, bu nedenle örneğin 500 numaralı çubukta buna ihtiyacınız vardır.

faster = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_MAIN, 500 ) 

bu son parametre, göstergenizin algoritmalarını uyguladığı çubuk numarasına uyacak şekilde değişmelidir.

Bu nedenle, döngü içinde buna ihtiyacınız vardır, böylece son parametre için döngü döngüsü yineleyicisini ( i ) kullanabilirsiniz, böylece geçmiş grafiğin her çubuğu için olduğu gibi macd değerinizi elde edersiniz.

faster = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_MAIN, i ), 

umarım bu işleri biraz netleştirmeye yardımcı olur.

 
WHRoeder :
Bu değişikliği deneyin
Neden for(int i = Çubuk-1 ?

Ve bu neden for(int i = Bars ??

Lütfen öğüt verin, teşekkürler