Gösterge Çeşitli Sorular - sayfa 15

 

Hesapla

OnCalculate() işlevi, yalnızca özel göstergelerde, Calculate olayıyla gösterge değerlerinin hesaplanması gerektiğinde çağrılır.

Bu genellikle, göstergenin hesaplandığı sembol için yeni bir onay işareti alındığında olur.

Bu göstergenin, bu sembolün herhangi bir fiyat tablosuna eklenmesi gerekli değildir.

OnCalculate() işlevi, bir int dönüş türüne sahip olmalıdır. İki olası tanım vardır. Bir gösterge içinde işlevin her iki sürümünü de kullanamazsınız.

İlk form, tek bir veri arabelleğinde hesaplanabilen göstergeler için tasarlanmıştır. Böyle bir göstergenin bir örneği Özel Hareketli Ortalama'dır.

int   OnCalculate ( const   int oranları_toplam, // fiyat[] dizisinin boyutu
                  const   int prev_calculated, // önceki bir çağrıda işlenen çubuklar
                  const   int başlıyor, // önemli verilerin başladığı yer
                  const   double & fiyat[] // hesaplanacak dizi
);

 
Marco vd Heijden :

Hesapla

OnCalculate() işlevi, yalnızca özel göstergelerde, Calculate olayıyla gösterge değerlerinin hesaplanması gerektiğinde çağrılır.

Bu genellikle, göstergenin hesaplandığı sembol için yeni bir onay işareti alındığında olur.

Bu göstergenin bu sembolün herhangi bir fiyat tablosuna eklenmesi gerekli değildir.

OnCalculate() işlevi, bir int dönüş türüne sahip olmalıdır. İki olası tanım vardır. Bir gösterge içinde işlevin her iki sürümünü de kullanamazsınız.

İlk form, tek bir veri arabelleğinde hesaplanabilen göstergelere yöneliktir. Böyle bir göstergenin bir örneği Özel Hareketli Ortalama'dır.

int   Hesapla ( const   int Rates_total, // fiyat[] dizisinin boyutu
                  const   int prev_calculated, // önceki bir çağrıda işlenen çubuklar
                  const   int başlıyor, // önemli verilerin başladığı yer
                  const   double & fiyat[] // hesaplanacak dizi
);

Mükemmel, Bay Marco , çok daha fazla teşekkürler.
 

("Gecikme" kelimesini kullanıyorum, fiyat hareketini geciktiriyor, sipariş aç, kapat, sadece bir kelime MT4 platformumu çökertiyor)

Özel göstergem için aşağıdaki işlevi kullanıyorum.

 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[]){...}

Özel göstergeme dönüş kodunu aşağıya yazdığımda özel göstergem gecikmeye başlıyor. Ama doğru çalışıyor, hangisini istiyorum.

 return ( 0 ); // starts to lag...

Ve aşağıda özel göstergeme dönüş kodunu yazdığımda, özel göstergem hangisini istediğimi düzgün çalışmıyor. Yani sahte MA çaprazı varken " Ok " önceki MA çapraz noktasına geri dönmüyor.

 return rates_total- 1 ; // does not go back to previous MA cross point
return (rates_total- 1 ); // and same thing here

S: Bu durum için ne yapabilirim, lütfen?

Şimdiden teşekkürler.

 
Max Enrik : Ve aşağıda özel göstergeme dönüş kodunu yazdığımda, özel göstergem hangisini istediğimi düzgün çalışmıyor. Yani sahte MA çaprazı varken " Ok " önceki MA çapraz noktasına geri dönmüyor.
Tüm kodunuzu gönderin. Bu bağlam olmadan anlamsızdır.
 
whroeder1 :
Tüm kodunuzu gönderin. Bu bağlam olmadan anlamsızdır.

Hadi bakalım.

Şimdiden teşekkürler.

Gösterge Örneği Tablo 06

 #property strict
#property indicator_chart_window
#property indicator_buffers 2

string arrowIcon= "delete arrow icon" ;

int i;
double arrowLow,arrowHigh,priceOne,priceTwo,priceOne_pre,priceTwo_pre,bufferOne[],bufferTwo[];
color clrup= clrBlue ,clrdown= clrRed ;
datetime arrowTime;
//---------------------------------------------------------
// OnDeinit
void OnDeinit ( const int reason)
  {
   ObjectsDeleteAll ( 0 , "delete" );
   return ;
  }
// OnInit
int OnInit ()
  {
   IndicatorDigits ( Digits );
// line
   SetIndexStyle ( 0 , DRAW_LINE , STYLE_SOLID , 1 ,clrdown);
   SetIndexBuffer ( 0 ,bufferOne);

   SetIndexStyle ( 1 , DRAW_LINE , STYLE_SOLID , 1 ,clrup);
   SetIndexBuffer ( 1 ,bufferTwo);
//---
   return ( 0 );
  }
// OnCalculate
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 lookback= 30 ; // I do not know what could I write here.
   for (i= Bars - 1 - MathMax (lookback,prev_calculated); i>= 0 ; --i)
     {
      bufferOne[i]= iMA ( Symbol (), 0 ,lookback/ 2 , 0 , MODE_EMA , PRICE_CLOSE ,i);
      bufferTwo[i]= iMA ( Symbol (), 0 ,lookback, 0 , MODE_EMA , PRICE_CLOSE ,i);

      priceOne = bufferOne[i];
      priceTwo = bufferTwo[i];
      priceOne_pre = bufferOne[i+ 5 ];
      priceTwo_pre = bufferTwo[i+ 5 ];

       // buy
       if (priceOne>priceTwo && priceOne_pre<=priceTwo_pre)
        {
         arrowTime= Time [i];
         //arrowLow  = iLow( Symbol(), 0, i );
         arrowLow= Low [i];

         objArrow();
         if ( ObjectFind ( 0 ,arrowIcon)>= 0 )
           {
             ObjectMove ( 0 ,arrowIcon, 0 ,arrowTime,arrowLow- 5 * Point );
             ObjectSetInteger ( 0 ,arrowIcon, OBJPROP_COLOR ,clrup);
             ObjectSetInteger ( 0 ,arrowIcon, OBJPROP_ANCHOR , ANCHOR_TOP );
           }
        }
       // sell
       if (bufferOne[i]<bufferTwo[i] && priceOne_pre>=priceTwo_pre)
        {
         arrowTime = Time [i];
         arrowHigh = High [i];

         objArrow();
         if ( ObjectFind ( 0 ,arrowIcon)>= 0 )
           {
             ObjectMove ( 0 ,arrowIcon, 0 ,arrowTime,arrowHigh+ 5 * Point );
             ObjectSetInteger ( 0 ,arrowIcon, OBJPROP_COLOR ,clrdown);
             ObjectSetInteger ( 0 ,arrowIcon, OBJPROP_ANCHOR , ANCHOR_BOTTOM );
           }
        }
     }
   Print ( "Time: " ,arrowTime, "  Low: " ,arrowLow);
//    Print( "priceOne ", DoubleToString( priceOne, Digits ), "  priceTwo ", DoubleToString( priceTwo, Digits ) );
//---
//return(0); // works correct but cause lags
   return (rates_total - 1 ); // no lags but does not go to previous ma cross after fake ma cross
  }
// objects
void objArrow()
  {
   if ( ObjectFind ( 0 ,arrowIcon)< 0 )
     {
       ObjectCreate ( 0 ,arrowIcon, OBJ_ARROW , 0 ,arrowTime,arrowLow);
       ObjectSetInteger ( 0 ,arrowIcon, OBJPROP_ARROWCODE , 159 );
       ObjectSetInteger ( 0 ,arrowIcon, OBJPROP_WIDTH , 2 );
     }
//---
   return ;
  }
//+------------------------------------------------------------------+
 
Max Enrik : Yani sahte MA çaprazı " Arrow " önceki MA çapraz noktasına geri dönmüyor.
Bunun için test yapmıyorsunuz ve geri hareket ettirmiyorsunuz.
 
whroeder1 :
Bunun için test yapmıyorsunuz ve geri hareket ettirmiyorsunuz.

TAMAM! Teşekkürler!
 

Hala daha net bir cevaba ihtiyacım var.

Şimdiden teşekkürler.

 

Cevap:   Hem Mevcut MA Çaprazını hem de Önceki MA Çaprazını kontrol edin .

#Buffer ( dizi aralık dışında ) - Kapalı
#Özel Gösterge Gecikmesi - Kapalı

 

#Loop - Open'ın ilk sonucu

 string counts;
void _a()
{
    counts += "a - " + IntegerToString ( ObjectsTotal ( OBJ_ARROW ) );
     //---
     return ;
}
void _b()
{
    counts += " - b - " + IntegerToString ( ObjectsTotal ( OBJ_ARROW ) );
     //---
     return ;
}
Print ( counts );
// while 1st loop: a - 2 - b - 4
// while 2nd loop: a - 2 - b - 4a - 2 - b - 4
// while 3rd loop: a - 2 - b - 4a - 2 - b - 4a - 2 - b - 4a - 2 - b - 4
// and so on...
// But I like only 1st loop results even that loop runs 10 thousand times

Şimdiden teşekkürler.