Ücretsiz bir gösterge yazacağım - sayfa 98

 
Aleksei Stepanenko :

Sadece biraz yardım edebilirim, tamamen ücretsiz.

Göstergenin altında iki işlev bulunur. Yorum, göstergenin kendisinin değerini ve son trend çizgisindeki mevcut noktanın değerini görüntüler.

Anlamak.

Teşekkürler, Alexey. Herşey gönlünce olsun.
 
AVK :
Teşekkürler, Alexey. Herşey gönlünce olsun.

.

 

Güzel gün!

Bu göstergeyi yazdı


 //+------------------------------------------------------------------+
//|                                                      MTF_H&L.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020"
#property strict
#property indicator_chart_window
#property indicator_buffers    2
#property indicator_width1      1
#property indicator_color1      clrTeal
#property indicator_type1      DRAW_LINE
#property indicator_width2      1
#property indicator_color2      clrCrimson
#property indicator_type2      DRAW_LINE
//---
input ENUM_TIMEFRAMES    period01 =   PERIOD_D1 ;
input ENUM_TIMEFRAMES    period02 =   PERIOD_M15 ;
input int                percount =   10 ;         //Ограничение истории

double Buffer1[];
double Buffer2[];
int     index1=- 1 ;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   SetIndexBuffer ( 0 , Buffer1, INDICATOR_DATA );
   SetIndexBuffer ( 1 , Buffer2, INDICATOR_DATA );
//---
   IndicatorDigits( Digits );
   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 i, limit, barcount;
   barcount=period01/ Period ()*percount;
   if (barcount != 0 ) limit = barcount; 
   else limit = rates_total - 2 ;
   
   for (i=limit;i>= 0 ;i--)
   {
       if (TimeSeconds(time[i])== 0 )
      index1= iBarShift ( Symbol (), period02, time[i], false );

       if (TimeHour(time[i])== 0 &&TimeMinute(time[i])<period02)
      {
      Buffer1[i]= iOpen ( NULL ,period02,index1);
      Buffer2[i]= iOpen ( NULL ,period02,index1);
      }
       else 
      {
      Buffer1[i]= iHigh ( NULL ,period02,index1);
       if (Buffer1[i]<Buffer1[i+ 1 ]){
      Buffer1[i]=Buffer1[i+ 1 ];}
      
      Buffer2[i]= iLow ( NULL ,period02,index1);
       if (Buffer2[i]>Buffer2[i+ 1 ]){
      Buffer2[i]=Buffer2[i+ 1 ];}
      }
   }
//---
   return (rates_total);
  }
//+------------------------------------------------------------------+

Göstergeyi düzeltmeye yardım edin veya bana nasıl olduğunu söyleyin.

1) Yeni bir dönem başladığında göstergenin "iOpen" ile başlaması için "period01" referans noktasını nasıl ayarlayacağımı bilmiyorum.

2) Bu tür "kaleleri" kullanmamak için "iHighest" i nasıl kullanacağımı çözemiyorum

 if (Buffer1[i]<Buffer1[i+ 1 ]){
   Buffer1[i]=Buffer1[i+ 1 ];}

Bana yardım et lütfen.

 
MakarFX :

Güzel gün!

Bu göstergeyi yazdı


Göstergeyi düzeltmeye yardım edin veya bana nasıl olduğunu söyleyin.

1) Yeni bir dönem başladığında göstergenin "iOpen" ile başlaması için "period01" referans noktasını nasıl ayarlayacağımı bilmiyorum.

2) Bu tür "kaleleri" kullanmamak için "iHighest" i nasıl kullanacağımı çözemiyorum

Bana yardım et lütfen.

neden yazdın

 
Алексей Тарабанов :

neden yazdın

desen arıyorum...

bodruma taşınırsa şöyle görünür


 
MakarFX :

Güzel gün!

Merhaba Makar!

Açılış fiyatı ne kadar? Hemen ilk çubuğun uç noktalarını alın. Bunun gibi:

 if (i==limit || TimeDay(time[i])!=TimeDay(time[i+ 1 ]))
   {
   Buffer1[i]= iHigh ( NULL ,period02,index1);
   Buffer2[i]= iLow ( NULL ,period02,index1);
   }
else
   {
   if ( iHigh ( NULL ,period02,index1)-Buffer1[i+ 1 ]> 0 )
      {
      Buffer1[i]= iHigh ( NULL ,period02,index1);
      }
   else
      {
      Buffer1[i]=Buffer1[i+ 1 ];
      }
   if (Buffer2[i+ 1 ]- iLow ( NULL ,period02,index1)> 0 )
      {
      Buffer2[i]= iLow ( NULL ,period02,index1);
      }
   else
      {
      Buffer2[i]=Buffer2[i+ 1 ]; 
      }
   }
Yoksa fikri yanlış mı anladım?
 
Aleksei Stepanenko :

Merhaba Makar!

Açılış fiyatı ne kadar? Hemen ilk çubuğun uç noktalarını alın. Bunun gibi:

Yoksa fikri yanlış mı anladım?

yazdım

1) Yeni bir dönemin başında göstergenin "iOpen" ile başlaması için " period01 " referans noktasını nasıl ayarlayacağımı bilmiyorum.

İlk çubuğun uç noktalarını hemen almak doğrudur ve "else" den sonra kodunuzu alacağım. Teşekkür ederim.

Ve burada

 if (i==limit || TimeDay(time[i])!=TimeDay(time[i+ 1 ]))

uygun değil, çünkü günün başlangıcına bağlı, ancak "period01" - H1; H4; vb

 

Alternatif olarak, geçerli tarihi zaman çerçevesindeki saniye sayısına bölebilir ve ardından elde edilen değeri öncekiyle karşılaştırabilirsiniz:

 int part= 0 ;

int OnCalculate (......)
   {

   for (......)
      {
       if (time[i]/ PeriodSeconds (period01)>part)
         {      
         part=time[i]/ PeriodSeconds (period01);
      
         Buffer1[i]= iHigh ( NULL ,period02,index1);
         Buffer2[i]= iLow ( NULL ,period02,index1);
         }
       else
.......
      

Muhtemelen, başlangıç programla senkronize olmayacak, ancak zaman aralıkları doğru sayılacaktır. İlk referansı nasıl senkronize edeceğinizi düşünebilirsiniz,

tip:

 if (time[i]% PeriodSeconds (period01)== 0 )
 
Aleksei Stepanenko :

Alternatif olarak, geçerli tarihi zaman çerçevesindeki saniye sayısına bölebilir ve ardından elde edilen değeri öncekiyle karşılaştırabilirsiniz:

Muhtemelen, başlangıç programla senkronize olmayacak, ancak zaman aralıkları doğru sayılacaktır. İlk referansı nasıl senkronize edeceğinizi düşünebilirsiniz,

tip:

Çok teşekkür ederim, deneyeceğim.
 

Benim için zevkti. Daha kısa giriş:

Buffer1[i]= MathMax ( iHigh ( NULL ,period02,index1),Buffer1[i+ 1 ]);
Buffer2[i]= MathMin ( iLow ( NULL ,period02,index1),Buffer2[i+ 1 ]);
Neden: