Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 545

 
GSB :

Başka bir çift nedir? Aynı göstergeyi tamamen farklı parametrelerle arayabilirsiniz.



Göstergenin kendisinde ise
 extern int        periodAMA= 10 ;
danışmanda
 extern int periodAMA_1= 8 ; 
extern int periodAMA_2= 13 ; 

Gösterge kodu, geçirilen parametreleri nasıl tanır?Farklı adları var mı?

Ama bu arada, her şey dediğin gibi. Senaryo ile tekrar kontrol ettim)

 
Forexman77 :
EA'da göstergenin kendisinde ise

Gösterge kodu, geçirilen parametreleri nasıl tanır?Farklı adları var mı?

Ama bu arada, her şey dediğin gibi. Senaryo ile tekrar kontrol ettim)


Çağıran programdaki değişken(ler)i istediğiniz gibi adlandırabilirsiniz, adı göstergedeki değişkenin adıyla hiçbir şekilde bağlantılı değildir, bunlar farklı değişkenlerdir ve genel olarak farklı uçbirim dizilerinden çağrılır.

İndikatör üçüncü pozisyonda gösterilen ismi ile çağrılır, 4. pozisyondan her çağrıldığında parametreler kendisine iletilir ve ardından iCustom() parametreleri indikatörün hesaplanmasında kullanılacak olan nedir.

per1=9 değişkeni ise ; ve iCustom() 4. sıradaysa, gösterge 9'luk bir süre ile hesaplanacak, başka bir değişken ayarlanacak - değeri hesaplamada kullanılacak ve bu tüm gösterge parametreleri için geçerli, asıl mesele onları koymak göstergenin kendisinde olduğu gibi doğru sıra. Göstergenin ilk parametresi olarak geçirilecek değişken (ona referans) - dördüncü sırada iCustom() beşinci sırada ikinci, vb.

 
GSB :

Çağıran programdaki değişken(ler)i istediğiniz gibi adlandırabilirsiniz, adı göstergedeki değişkenin adıyla hiçbir şekilde bağlantılı değildir, bunlar farklı değişkenlerdir ve genel olarak farklı uçbirim dizilerinden çağrılır.

İndikatör üçüncü pozisyonda gösterilen ismi ile çağrılır, 4. pozisyondan her çağrıldığında parametreler kendisine iletilir ve ardından iCustom() parametreleri indikatörün hesaplanmasında kullanılacak olan nedir.

per1=9 değişkeni ise; ve iCustom() 4. sıradaysa, gösterge 9'luk bir süre ile hesaplanacak, başka bir değişken ayarlanacak - değeri hesaplamada kullanılacak ve bu tüm gösterge parametreleri için geçerli, asıl mesele onları koymak göstergenin kendisinde olduğu gibi doğru sıra. Göstergenin ilk parametresi olarak geçirilecek değişken (ona referans) - dördüncü sırada iCustom() beşinci sırada ikinci, vb.



Anladım. Öğreticide, buna zorlanabilir değerler geçişi deniyor gibi görünüyor.
 

Forumu çöpe atmaya ve ayrı bir konu açmaya değmeyeceğini düşündüm, ama gerçekten sorunuma yapıcı bir cevap vermeyi umuyorum, bu olmadan kımıldamayacağım :(
Çeşitli göstergeler yazmaya çalıştım, her şey yolunda görünüyor, şimdi her şeyi iCustom() işlevini kullanarak Expert Advisor'a aktarıyorum. Danışmandaki kod:

 double ma= iCustom ( NULL , 0 , "TestMA" , 0 , 1 );

göstergenin kendisi (test için yazılmıştır)

 //+------------------------------------------------------------------+
//|                                                       TestMA.mq4 |
//|                                  Copyright 2014, Semyon Polyakov |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Semyon Polyakov"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window

double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   
 
   SetIndexStyle ( 0 , DRAW_LINE , EMPTY , 1 , clrRed );
   SetIndexBuffer ( 0 ,ExtMapBuffer1);
//---
   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 counted_bars= IndicatorCounted (),
       limit;
 
   if (counted_bars> 0 )
      counted_bars--;
   
   limit= Bars -counted_bars;
     
   for ( int i= 0 ;i<limit;i++)
   {
      ExtMapBuffer1[i]=SimpleMA(i, 20 ,close);
   }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
  
   double SimpleMA( const int position, const int period, const double &price[])
  {
//---
   double result= 0.0 ;
//--- check position
   if (position>= 0 && period> 0 )
     {
       //--- calculate value
       for ( int i= 0 ;i<period;i++) result+=price[position+i];
      result/=period;
     }
//---
   return (result);
  }
//+------------------------------------------------------------------+

Ardından, test ederken EMPTY_VALUE ile saçmalayın.

Onlar. test etmeye başladığımızda, EA'nın başlangıç tarihine sahibiz ve bu tarihten önceki her şey iCustom doğru gösterge değerlerini verir, bundan sonraki her şey doğrudan test edilir - EMPTY_VALUE. :(
Zaten Google'da ve forumda gezinmekten bıktım, "geleceğe bakma" hakkında yazıyorlar ama kodda bunu göremiyorum. nerede aptalım?)

 
Semionn :

Forumu çöpe atmaya ve ayrı bir konu açmaya değmeyeceğini düşündüm, ama gerçekten sorunuma yapıcı bir cevap vermeyi umuyorum, bu olmadan kımıldamayacağım :(
Çeşitli göstergeler yazmaya çalıştım, her şey yolunda görünüyor, şimdi her şeyi iCustom() işlevini kullanarak Expert Advisor'a aktarıyorum. Danışmandaki kod:

göstergenin kendisi (test için yazılmıştır)

Ardından, test ederken EMPTY_VALUE ile saçmalayın.

Onlar. test etmeye başladığımızda, EA'nın başlangıç tarihine sahibiz ve bu tarihten önceki her şey iCustom doğru gösterge değerlerini verir, bundan sonraki her şey doğrudan test edilir - EMPTY_VALUE. :(
Zaten Google'da ve forumda gezinmekten bıktım, "geleceğe bakma" hakkında yazıyorlar ama kodda bunu göremiyorum. nerede aptalım?)

Hata, uzmanın kodunda görünüyor, neden hata ayıklayıcıyı kullanmıyorsunuz? Kesme noktaları ayarlayın, değişkenlerin değerlerine bakın ve genel olarak göstergenin çağrıldığını, tarihinizden önce ve sonra ne olduğunu göreceksiniz.
 
GSB :
Hata, uzmanın kodunda görünüyor, neden hata ayıklayıcıyı kullanmıyorsunuz? Kesme noktaları ayarlayın, değişkenlerin değerlerine bakın ve genel olarak göstergenin çağrıldığını, tarihinizden önce ve sonra ne olduğunu göreceksiniz.

Hata ayıklayıcı yalnızca demo hesap modunda kullanılabilir ve test için değil, ayrıca yazdım - gösterge çağrılır, çalışır ve değerleri döndürür, hatta doğru olanları bile, ancak yalnızca belirtilen tarihe kadar (test başlangıç tarihi). Expert Advisor'da değişkenlerin değerlerini görüntülüyorum, bu yüzden önce her şey yolunda, sonra EMPTY_VALUE diyorum
 
Semionn :

Hata ayıklayıcı yalnızca demo hesap modunda kullanılabilir ve test için değil, ayrıca yazdım - gösterge çağrılır, çalışır ve değerleri döndürür, hatta doğru olanları bile, ancak yalnızca belirtilen tarihe kadar (test başlangıç tarihi). Expert Advisor'da değişkenlerin değerlerini görüntülüyorum, bu yüzden önce her şey yolunda, sonra EMPTY_VALUE diyorum


Özel göstergelerde yeni çubukların nasıl izleneceğini dikkatlice okudunuz mu?

[QUOTE]İlk parametre Rates_total, gösterge tarafından hesaplanabilecek çubukların sayısını içerir ve grafikte mevcut olan çubukların sayısına karşılık gelir.

OnCalculate() işlevi tarafından döndürülen değer ile ikinci giriş parametresi prev_calculated arasındaki ilişkiye dikkat edin. İşlev çağrılırken prev_calculated parametresi, önceki çağrıda OnCalculate() işlevi tarafından döndürülen değeri içerir. Bu, bu işlevin önceki başlatılmasından bu yana değişmeyen çubuklar için yeniden hesaplamalardan kaçınmak için özel bir göstergeyi hesaplamak için ekonomik algoritmalar uygulamanıza olanak tanır.

Bunu yapmak için, geçerli işlev çağrısındaki çubuk sayısını içeren Rate_total parametresinin değerini döndürmek genellikle yeterlidir. OnCalculate() işlevine yapılan son çağrıdan bu yana fiyat verileri değiştiyse (daha derin geçmiş yüklendi veya geçmiş boşlukları dolduruldu), prev_calculated girdi parametresinin değeri terminalin kendisi tarafından sıfıra ayarlanacaktır. [/alıntı]

 

20 gün boyunca bir günlük momentumların ortalamasını bulmanız ve ardından beş gün boyunca 20 günlük momentumun ortalamasını bulmanız gerekir.

20 günlük ortalamayı bulmak sorun değildi. Ama bu ortalamadan nasıl beşlik bir ortalama alacağımı bilmiyorum.

 #property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Lime

//--- input parameters
extern int        Period_MA_1= 1 ;
extern int        p          = 20 ;
//--- buffers
double ExtMapBuffer1[];
double val20[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle ( 0 , DRAW_LINE );
   SetIndexBuffer ( 0 ,ExtMapBuffer1);
   IndicatorDigits ( Digits + 1 );
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
     int counted_bars= IndicatorCounted (),                      
    limit;
     double momentum20;
   if (counted_bars> 0 )
      counted_bars--;  
   limit= Bars -counted_bars;
    
   for ( int i= 0 ;i<limit;i++)
   {
      momentum20= 0 ;
       ArrayInitialize (val20, 0 );      
       for ( int k=p;k>= 0 ;k--)
      {
       ArrayResize (val20,p);
      val20[k]= Close [i+k]- Close [i+k+Period_MA_1];
      momentum20=momentum20+val20[k];
      }
      momentum20=momentum20/p;
      ExtMapBuffer1[i]=momentum20;
   }
   return ( 0 );
  }
 
Forexman77 :

20 gün boyunca bir günlük momentumların ortalamasını bulmanız ve ardından beş gün boyunca 20 günlük momentumun ortalamasını bulmanız gerekir.

20 günlük ortalamayı bulmak sorun değildi. Ama bu ortalamadan nasıl beşlik bir ortalama alacağımı bilmiyorum.



 //+------------------------------------------------------------------+
//|                                                   ForexMan77.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link        "vinin@mail.ru"
#property version    "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Yellow
#property indicator_color3 Red

//--- input parameters
extern int        Period_MA_1= 1 ;
extern int        p2          = 20 ;
extern int        p3          = 5 ;
//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle ( 0 , DRAW_LINE );
   SetIndexBuffer ( 0 ,ExtMapBuffer1);
   SetIndexStyle ( 1 , DRAW_LINE );
   SetIndexBuffer ( 1 ,ExtMapBuffer2);
   SetIndexStyle ( 2 , DRAW_LINE );
   SetIndexBuffer ( 2 ,ExtMapBuffer3);

//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars= IndicatorCounted (),
   i,limit1,limit2,limit3;
   limit1= Bars -counted_bars- 1 ;
   limit2=limit1;
   limit3=limit2;
   if (limit1> 0 ) 
     {
      limit1= Bars -Period_MA_1- 1 ;
      limit2=limit1-p2;
      limit3=limit2-p3;
     }

   for (i=limit1;i>= 0 ;i--) ExtMapBuffer1[i]= iMomentum ( NULL , 0 , Period_MA_1, PRICE_CLOSE , i);
   for (i=limit2;i>= 0 ;i--) ExtMapBuffer2[i]= iMAOnArray (ExtMapBuffer1, 0 , p2, 0 , MODE_SMA ,i);
   for (i=limit3;i>= 0 ;i--) ExtMapBuffer3[i]= iMAOnArray (ExtMapBuffer2, 0 , p3, 0 , MODE_SMA ,i);

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

Yardım

 int OnInit ()
{
   EventSetTimer ( 60 );
   Print (GetLastError());

   return ( INIT_SUCCEEDED );
}

Zamanlayıcı çalışmıyor, yanlış ve 4051 hatası veriyor

Veya test cihazında ve çalışmamalı mı?

Neden: