D1 Döneminin Açık fiyatını çapraz kesen M1 Dönemi Çubuklarını saymak için gösterge

 

Selamlar! Bu gösterge hakkında yardıma ihtiyacım var. D1 Döneminde Açık fiyat seviyesine denk gelen M1 Dönemindeki Çubuk sayısını saymak için farklı yöntemler deniyor. Kodlama girişimimi ekledim ancak başarılı bir şekilde çalıştıramadım. Bunun için çok uğraştım ama duvara çarptım bu yüzden şimdi yardım için buradaki nazik beylerden yardım istiyorum!

İşte bu gösterge için ihtiyacım olan şey:

1. M1 Döneminde bir Bar fiyatı, D1 Döneminde Açık fiyatıyla karşılaştığında sayılır. M1 Periyodunda her D1 Periyodu için 1440 bar vardır, bu nedenle her 1440 bar test edilecektir.

2. Her D1 Çubuğu için toplam sayı/D1 Çubuğu toplanacak ve belirli bir değere göre ortalaması alınacaktır. Ortalamanın 30 olduğunu söyleyin, bu 30 D1 çubuklarının sayısıdır.

 //+------------------------------------------------------------------+
//|                                                          XXX.mq4 |
//|                                              Copyright 2014, XXX |
//|                                                              XXX |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, XXX"
#property link        "XXX"
#property version    "1.00"
#property indicator_separate_window      // Indicator is drawn in the main window
#property indicator_buffers 1        // Number of buffers
#property indicator_color1 Blue     // Color of the 1st line
//#property indicator_color2 Red      // Color of the 2nd line
 int count;   // Bar index
extern int Aver_Bars= 30 ;             // number of bars for calculation
//extern double lots= 0.1; 
//extern int Pnt= 10; // Point multiplier for the pips.
double Buf_0[], Buf_1[];             // Declaring indicator arrays
//THIS INDICATOR IS TO COUNT NUMBER OF M1 BARS WHICH HIGH[I] IS HIGHER AND LOW[I] IS LOWER THAN OPEN[1440].
//--------------------------------------------------------------------
int init()                           // Special function init()
  {
//--------------------------------------------------------------------
   SetIndexBuffer ( 0 ,Buf_0);         // Assigning an array to a buffer
   SetIndexStyle ( 0 , DRAW_LINE , STYLE_SOLID , 2 ); // Line style
//--------------------------------------------------------------------
   SetIndexBuffer ( 1 ,Buf_1);         // Assigning an array to a buffer
   //SetIndexStyle (1,DRAW_LINE,STYLE_DOT,1);// Line style
//--------------------------------------------------------------------
   return ( 0 );                           // Exit the special funct.init()
  }
//--------------------------------------------------------------------
int start()                         // Special function start()
  {
   if (Crosses()) count++;
   int i, n,                           // Bar index
       Counted_bars; 
       Buf_1[i]= count;               // Number of counted bars
   double    Sum_H;  
//--------------------------------------------------------------------
   Counted_bars= IndicatorCounted (); // Number of counted bars
   i= Bars -Counted_bars- 1 ;           // Index of the first uncounted
   while (i>= 0 )                       // Loop for uncounted bars
     {
      Sum_H= 0 ;                       // Nulling at loop beginning
    
       for (n=i;n<=i+Aver_Bars- 1 ;n++) // Loop of summing values
     {
      Buf_0[i]=Buf_1[n];             // Value of 0 buffer on i bar
    
      i--;                           // Calculating index of the next bar
     }
  }   
//--------------------------------------------------------------------
   return ( 0 );                           // Exit the special funct. start()
  }
//--------------------------------------------------------------------

bool Crosses()
   {
   int i;
   double H= iHigh ( NULL , PERIOD_M1 ,i);
   double L= iLow ( NULL , PERIOD_M1 ,i);
   double O= iOpen ( NULL , PERIOD_D1 ,i);
 
       if (O > L && O < H)
         
   return ( true );

else
return ( EMPTY_VALUE );
   }

3. Ardından ortalama değer, gösterge olarak çizilecektir.

 
LÜTFEN HERKES YARDIMCI OLSUN! BU HİÇ MÜMKÜN MÜ?
 

Ne yapmaya çalıştığınızı kodunuzdan anlayamıyorum ama 2 yerde değişkene ia değeri vermiyorsunuz. Bunu ele almanız gerekiyor.

 int start()                         // Special function start()
  {
   if (Crosses()) count++;
   int i , n,                           // Bar index
       Counted_bars; 
       Buf_1[i]= count;                // Number of counted bars
   double    Sum_H;  
//--------------------------------------------------------------------
   Counted_bars= IndicatorCounted (); // Number of counted bars
   i= Bars -Counted_bars- 1 ;           // Index of the first uncounted
   while (i>= 0 )                       // Loop for uncounted bars
     {
      Sum_H= 0 ;                       // Nulling at loop beginning
    
       for (n=i;n<=i+Aver_Bars- 1 ;n++) // Loop of summing values
     {
      Buf_0[i]=Buf_1[n];             // Value of 0 buffer on i bar
    
      i--;                           // Calculating index of the next bar
     }
  }   
//--------------------------------------------------------------------
   return ( 0 );                           // Exit the special funct. start()
  }
//--------------------------------------------------------------------

bool Crosses()
   {
   int i;
   double H= iHigh ( NULL , PERIOD_M1 , i );
   double L= iLow ( NULL , PERIOD_M1 , i );
   double O= iOpen ( NULL , PERIOD_D1 , i );
 
       if (O > L && O < H)
         
   return ( true );

else
return ( EMPTY_VALUE );
   }
 

Açık sözlü olduğum için üzgünüm, ancak kodunuz, yeteneğinizin çok ötesinde bir şey elde etmeye çalıştığınızı gösteriyor.

Misal

 bool Crosses()
   {
   int i;
   double H= iHigh ( NULL , PERIOD_M1 ,i);
   double L= iLow ( NULL , PERIOD_M1 ,i);
   double O= iOpen ( NULL , PERIOD_D1 ,i);
 
       if (O > L && O < H)
         
   return ( true );

else
return ( EMPTY_VALUE );

Diyelim ki örneğin i = 1

 double O= iOpen ( NULL , PERIOD_D1 ,1);

Bu, dünün açılış fiyatını döndürür

   double H= iHigh ( NULL , PERIOD_M1 , 1 );
   double L= iLow ( NULL , PERIOD_M1 , 1 );

Bu 2, son kapatılan 1 dakikalık çubuğun değerlerini döndürür.


Yani 1 dakika önceki değerleri dünkü açılışla karşılaştırıyorsunuz.

i = 2 ise, 2 dakika öncesinden 2 gün önce açık olan değerleri karşılaştıracaksınız.

İstediğiniz şeyin bu olamayacağını görmelisiniz.

 
GumRai :

Açık sözlü olduğum için üzgünüm, ancak kodunuz, yeteneğinizin çok ötesinde bir şey elde etmeye çalıştığınızı gösteriyor.

Misal

Diyelim ki örneğin i = 1

Bu, dünün açılış fiyatını döndürür

Bu 2, son kapatılan 1 dakikalık çubuğun değerlerini döndürür.


Yani 1 dakika önceki değerleri dünkü açılışla karşılaştırıyorsunuz.

i = 2 ise, 2 dakika öncesinden 2 gün önce açık olan değerleri karşılaştıracaksınız.

İstediğiniz şeyin bu olamayacağını görmelisiniz.


Merhaba GumRai,

Bana yardım etmek için zaman ayırdığınız için teşekkürler. Haklısın, ben sadece acemiyim ve EA kodlamayı öğrenmek için hevesle çok çalışıyorum. İşte yapmaya çalıştığım şey:

1. PERIOD_D1'i kendi D1 çubuğunda her dakika açık olan PERIOD_M1 çubuğuyla karşılaştırın, dolayısıyla D1 çubuğuyla karşılaştırılacak 1440 M1 çubuğu vardır. Ardından (O > L && O < H) koşulunu sağlayan M1 çubuklarını sayın.

2. Sayılan çubukları bir dizide saklayın, ardından tekrar bir sonraki D1 çubuğuna ilerleyin ve döngüyü yeniden tekrarlayın.

3. Sayılan çubuklar, günlük grafikte gösterge tarafından çizilecektir. Dolayısıyla, ifadeleri karşılayan M1 çubuklarının 5 olduğunu söylersek, bu 5 günlük Bar1'in değeri olarak çizilecektir. Ardından, bir sonraki günlük çubuk için sayılan M1 çubuğunun 10 olduğunu söyleyin, ardından önceki çubuk Çubuk2'ye taşındığı için Çubuk1'de tekrar çizilecektir.

Lütfen bana mücadele ettiğim bu basit ifadeyi en iyi nasıl kodlayacağımı gösterin. Daha fazla açıklamaya ihtiyacınız olduğunu bana bildirin. ve büyük teşekkürler.

 
Zaldy :


Merhaba GumRai,

Bana yardım etmek için zaman ayırdığınız için teşekkürler. Haklısın, ben sadece acemiyim ve EA kodlamayı öğrenmek için hevesle çok çalışıyorum. İşte yapmaya çalıştığım şey:

1. PERIOD_D1'i kendi D1 çubuğunda her dakika açık olan PERIOD_M1 çubuğunu karşılaştırın, böylece D1 çubuğuyla karşılaştırmak için 1440 M1 çubuğu vardır. Ardından (O > L && O < H) koşulunu sağlayan M1 çubuklarını sayın.

2. Sayılan çubukları bir dizide saklayın, ardından tekrar bir sonraki D1 çubuğuna ilerleyin ve döngüyü tekrarlayın.

3. Sayılan çubuklar, günlük grafikte gösterge tarafından çizilecektir. Dolayısıyla, ifadeleri karşılayan M1 çubuklarının 5 olduğunu söylersek, bu 5 günlük Bar1'in değeri olarak çizilecektir. Ardından, bir sonraki günlük çubuk için sayılan M1 çubuğunun 10 olduğunu söyleyin, ardından önceki çubuk Çubuk2'ye taşındığı için Çubuk1'de tekrar çizilecektir.

Lütfen bana mücadele ettiğim bu basit ifadeyi en iyi nasıl kodlayacağımı gösterin. Daha fazla açıklamaya ihtiyacınız olduğunu bana bildirin. ve büyük teşekkürler.


Size yardımcı olmaktan memnuniyet duyarım, ancak öğrenmenize yardımcı olmayacağı için kodu yazmayacağım.

Öncelikle 1440 M1 barların her zaman 1 günlük bir süreye tekabül etmeyeceğini anlamalısınız. Bir bar sırasında kene yoksa, o çubuk geçmişten kaybolacak ve beklediğinizden daha az olabilir.

Yani D1 mumunun açılışı için tarih saat değerine ihtiyacınız var. Bunu yapabilir misin? Deneyin ve kodunuzu gönderin

 

çok hızlı değil

ne yapmaya çalıştığını biliyorum ve kodun ( eğer (O > L && O <H) ) istediğini elde edemez

@ ekli çizelgeye bakın



yukarı bakan ok bugünün açılışı

& sağa bakan ok , kodunuzla eşleşen ilk çubuktur ( if (O > L && O < H) ) yani say = 1

ama bugünkü açılışın üzerinde barın kapandığına dikkat ederseniz, aslında saymanın = 2 olması gerekiyordu (en azından (sadece kene grafiğinde yapamayacağınız birkaç çarpı daha olabilir))

ama ur kod sayımında = sadece 1

 
qjol :

çok hızlı değil

ne yapmaya çalıştığını biliyorum ve kodun ( eğer (O > L && O <H) ) istediğini alamayacak

@ ekli çizelgeye bakın



yukarı bakan ok bugünün açılışı

& sağa bakan ok , kodunuzla eşleşen ilk çubuktur ( if (O > L && O < H) ) yani say = 1

ama bugünkü açılışın üzerinde barın kapandığına dikkat ederseniz, aslında saymanın = 2 olması gerekiyordu (en azından (sadece kene grafiğinde yapamayacağınız birkaç çarpı daha olabilir))

ama ur kod sayımında = sadece 1


Anladığım kadarıyla açılış fiyatını aşan çubukları saymak istiyor - yine de yanılıyor olabilirim :)
 
  1. Zaldy : LÜTFEN HERKESE YARDIMCI OLSUN! BU HİÇ MÜMKÜN MÜ?
    Bize BAĞIRLAMA. Elbette mümkün.
  2. Tamsayılar ve booleler dönüştürülebilir. Yanlış == 0, doğru = sıfır değil.
     return ( true ); else return ( EMPTY_VALUE );
    return ( true ); else return ( 2147483647 );
    return ( true ); else return ( true );
  3. Ayrıca üç zaman dilimiyle uğraşıyorsunuz, D1, çizelge, M1. dönüştürmeniz gerekir.
    Derlenmedi veya test edilmedi.
       Counted_bars= IndicatorCounted (); // Number of counted bars
       for (iCht = Bars - 1 - Counted_bars; iCht >= 0 ; iCht--){ // Chart bars
          int      iD1    = iBarShift ( NULL , PERIOD_D1 , Time [iCht];
           double   openD1 = iOpen ( NULL , PERIOD_D1 , iD1);
           int      iM1Beg = iBarShift ( NULL , PERIOD_M1 , Time [iCht],
                   iM1End = - 1 ;
           if (iCht > 0 ) iM1End = iBarShift ( NULL , PERIOD_M1 , Time [iCht- 1 ];
          for (Buf_0[i] = 0 ; iM1Beg > iM1End; iM1Beg--){
             double hM1 = iHigh ( NULL , PERIOD_M1 , iM1Beg),
                    lM1 =   iLow ( NULL , PERIOD_M1 , iM1Beg);
    // count Bars of M1 Period that crisscross Open price of D1 Period 
             if ( hM1 >= openD1 && openD1 >= lM1) Buf_0[iCht]++; 
          }
       }
    
    Derlenmedi veya test edilmedi.
 
qjol :

çok hızlı değil

ne yapmaya çalıştığını biliyorum ve kodun ( eğer (O > L && O <H) ) istediğini alamayacak

@ ekli çizelgeye bakın



yukarı bakan ok bugünün açılışı

& sağa bakan ok , kodunuzla eşleşen ilk çubuktur ( if (O > L && O < H) ) yani say = 1

ama bugünkü açılışın üzerinde barın kapandığına dikkat ederseniz, aslında saymanın = 2 olması gerekiyordu (en azından (sadece kene grafiğinde yapamayacağınız birkaç çarpı daha olabilir))

ama ur kod sayımında = sadece 1


Merhaba Qjol, Evet, sağa bakan ok, istediğim ilk sayıdır. Yalnızca D1 Open'ı çapraz kesenler sayılır. çabalarınız için tekrar teşekkürler.
 
WHRoeder :
  1. Zaldy : LÜTFEN HERKESE YARDIMCI OLSUN! BU HİÇ MÜMKÜN MÜ?
    Bize BAĞIRLAMA. Elbette mümkün.
  2. Tamsayılar ve booleler dönüştürülebilir. Yanlış == 0, doğru = sıfır değil.
  3. Ayrıca üç zaman dilimiyle uğraşıyorsunuz, D1, çizelge, M1. dönüştürmeniz gerekir.
    Derlenmedi veya test edilmedi.
    Derlenmedi veya test edilmedi.

Teşekkürler WHRoeder ve burada büyük harf kullandığım için özür dilerim! Önerilerinizi deneyeceğim ve sonuç için buraya geri döneceğim.
Neden: