MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 567

 
PolarSeaman :

Hala uçuyor.

[i+ 1 ] var, +2 tane daha kontrol etmeniz gerekiyor

genel olarak böyle bir şey yapmalısın

limit=(rates_total<cb || cb<= 0 ) ? rates_total- 1 : cb;
if (limit<= 0 ) return ( 0 );
 
Ihor Herasko :

Çünkü çek temelde yanlıştır. Diyelim ki Barlar 1000 ve cb de 1000 döndürdü. Sonra döngüde, ilk yinelemede 1000 değerini alıyorum. Döngü gövdesinin ilk koşulunda:

diziden aynı anda iki çıkış: 1000 indeksli ve 1001 indeksli çubuğa erişim. Sonuçta, grafikte 1000 çubuk varsa, o zaman ilk çubuk 0 indeksine ve sonuncusu - 999'a sahiptir.

Döngünün gövdesi boyunca, tarihte daha da uzak çubuklara bir itiraz vardır:

Tüm bunlar ilk kontrol sırasında dikkate alınmalıdır.

Doğru nasıl kontrol edilir? MQL4 yardımındaki IndicatorCounted() işlevi örneğine bakın. Yalnızca şimdi IndicatorCounted()'ı Rate_total (bu Barlar) ve prev_calculated (bu IndicatorCounted()) değişkenlerini paylaşmakla değiştirmek daha iyidir.

Teşekkürler, Bulundu

 int counted_bars= IndicatorCounted (); 
     if (counted_bars> 0 ) counted_bars--;

ne ile karşılaştıralım? örnekte limit ile başlar

 limit= Bars -counted_bars;

bu "cb"yi neyle karşılaştırmalıyım?

 
PolarSeaman :

Teşekkürler, Bulundu

ne ile karşılaştıralım? örnekte limit ile başlar

bu "cb"yi neyle karşılaştırmalıyım?

Gösterge verilerinin görüntülendiği çubuk sayısını sınırlamanız gerekirse, bunu yapmak daha iyidir:

 int GetRecalcIndex( int & total, const int ratesTotal, const int prevCalculated)
{
   total = ratesTotal - 2 - barsig;                                                                         
                                                   
   if (cb > 0 && cb < total)
      total = MathMin (cb, total);                      
                                                   
   if (prevCalculated < ratesTotal - 1 )                     
   {       
      InitializeBuffers();     // Это функция, которая должна заново инициализировать все индикаторные буфера, т. к. имеем дело с первой загрузкой индикатора или подкачкой истории
       return (total);
   }
   
   return ( MathMin (ratesTotal - prevCalculated, total));                            
}

Bu şekilde kullanın:

 int total;   
int limit = GetRecalcIndex(total, rates_total, prev_calculated);                                

for ( int i = limit; i >= 0 ; --i)
{
  ...
}
Toplam değer, gösterge ayarlarının değerlerine göre erişilebilen, tarihteki en derin çubuğun indeksidir.
 
Taras Slobodyanik :

[i+ 1 ] var, +2 tane daha kontrol etmeniz gerekiyor

genel olarak böyle bir şey yapmalısın

Tam olarak böyle yaptım, 'HiLo.mq4' (122,15) içinde dizi aralık dışında yazıyor

+2 daha ne kontrol edilir?


 
Ihor Herasko :

Gösterge verilerinin görüntülendiği çubuk sayısını sınırlamanız gerekirse, bunu yapmak daha iyidir:

Bu şekilde kullanın:

Toplam değer, gösterge ayarlarının değerlerine göre erişilebilen, tarihteki en derin çubuğun indeksidir.

derleyici yemin ediyor

'InitializeBuffers' - işlev tanımlanmadı MerhabaLo.mq4 161 7

ve bu işlevle ilgili yardımda hiçbir şey yok
 
PolarSeaman :

derleyici yemin ediyor

'InitializeBuffers' - işlev tanımlanmadı MerhabaLo.mq4 161 7

ve yardımda bu işlevle ilgili hiçbir şey yok

Yoruma bunun tüm gösterge arabelleklerini başlatması gereken bir işlev olduğunu yazdım. Bu, kullanıcı tanımlı bir fonksiyondur. bende şöyle var:

 void InitializeBuffers()
{
   ArrayInitialize (g_indValues, EMPTY_VALUE );
   ArrayInitialize (g_tempBuffer, EMPTY_VALUE );
}

başka birine sahip olacaksın diğer tamponlara. Gösterge grafik nesnelerle çalışıyorsa , o zaman burada hepsini silmeniz gerekir, çünkü okumaların ilk işlenmesi yapılmalıdır.

 
Ihor Herasko :

Yoruma bunun tüm gösterge arabelleklerini başlatması gereken bir işlev olduğunu yazdım. Bu, kullanıcı tanımlı bir fonksiyondur. bende şöyle var:

başka birine sahip olacaksın diğer tamponlara. Gösterge grafik nesnelerle çalışıyorsa , o zaman burada hepsini silmeniz gerekir, çünkü okumaların ilk işlenmesi yapılmalıdır.

Teşekkürler, ama hiçbir şey değişmedi ...dizi 'HiLo.mq4' (130,15) içinde aralık dışında

. Sorun nedir?

 #property copyright "Copyright ©  november 2015"
#property strict 

#property indicator_chart_window
#property indicator_buffers 6

#property indicator_color1 RoyalBlue       //DodgerBlue
#property indicator_color2 Crimson         //OrangeRed
#property indicator_color3 Black   //White
#property indicator_color4 Black   //White
#property indicator_color5 Black             //White
#property indicator_color6 Black         //Red

#property indicator_width1 2
#property indicator_width2 2

#property indicator_style3 STYLE_DOT
#property indicator_style4 STYLE_DOT

input int     p        = 10 ;     // Период
input int     s        = 5 ;     // Угол наклона
input double distance = 2.0 ;   // Ширина канала
input bool    showBb   = false ;   // Границы канала
input bool    showCl   = true ;   // Центральная линия
input int     barsig   = 1 ;     // Сигнальная свеча (номер)
input int     arrots   = 0 ;     // Стрелка (отступ)
input int     arrsz    = 0 ;     // Стрелка (размер)
input int     ATR      = 1000 ;   // Период ATR
input int     cb       = 1000 ;   // Сколько свечей в истории

double fx1[],fx2[],hp[];
double z1,z2,ki;
int fs;

double upper[],lower[];
double upar[],dnar[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ( void )
  {
//--- indicator buffers mapping
IndicatorBuffers ( 7 );
SetIndexBuffer ( 0 ,fx1);
SetIndexBuffer ( 1 ,fx2);
SetIndexBuffer ( 2 ,lower);
SetIndexBuffer ( 3 ,upper);
SetIndexBuffer ( 4 ,upar);
SetIndexBuffer ( 5 ,dnar);
SetIndexBuffer ( 6 ,hp);


SetIndexStyle ( 4 , DRAW_ARROW , 0 ,arrsz);
SetIndexArrow ( 4 , 233 );
SetIndexStyle ( 5 , DRAW_ARROW , 0 ,arrsz);
SetIndexArrow ( 5 , 234 );

   if (showBb)
   { SetIndexStyle ( 2 , DRAW_LINE );
     SetIndexStyle ( 3 , DRAW_LINE );
   }
   else
   { SetIndexStyle ( 2 , DRAW_NONE );
     SetIndexStyle ( 3 , DRAW_NONE );
   }
   
     if (showCl)
   { SetIndexStyle ( 0 , DRAW_LINE );
     SetIndexStyle ( 1 , DRAW_LINE );
   }
   else
   { SetIndexStyle ( 0 , DRAW_NONE );
     SetIndexStyle ( 1 , DRAW_NONE );
   }

SetIndexEmptyValue ( 0 , 0.0 );
SetIndexEmptyValue ( 1 , 0.0 );

//---
   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;
//   limit=(rates_total<cb || cb<=0) ? rates_total-2 : cb;
//if (limit<=0) return(0);
 int total;   
 limit = GetRecalcIndex(total, rates_total, prev_calculated);                                

for ( int i = limit; i >= 0 ; --i)
{ 
  
  
   SetIndexDrawBegin ( 0 , Bars -cb);
   SetIndexDrawBegin ( 1 , Bars -cb);

double avg;

ki= 2.0 /(p+ 1 );

for (i=cb; i>= 0 ; i--) {fx1[i]= Close [i];}

for ( int m= 0 ; m<=s; m++)
{
z1=fx1[ 0 ];
for (i= 0 ; i<=cb; i++) {z1=z1+(fx1[i]-z1)*ki; hp[i]=z1;}

z2=fx1[cb];
for (i=cb; i>= 0 ; i--) {z2=z2+(fx1[i]-z2)*ki; fx1[i]=(hp[i]+z2)/ 2 ;}
}

fs= 0 ;
for (i=cb; i>= 0 ; i--)
{
if (fx1[i]>fx1[i+ 1 ]) fs= 1 ;
if (fx1[i]<fx1[i+ 1 ]) { if (fs== 1 ) fx2[i+ 1 ]=fx1[i+ 1 ]; fs= 2 ;}
if (fs== 2 ) fx2[i]=fx1[i]; else fx2[i]= 0.0 ;

avg = iATR ( NULL , 0 ,ATR, i+ 10 );
upper[i] = hp[i] + distance*avg;
lower[i] = hp[i] - distance*avg;

if ( Close [i+ 1 +barsig]<upper[i+ 1 +barsig] && Close [i+barsig]>upper[i+barsig])
 dnar[i] = High [i]+arrots* Point ; else dnar[i] = EMPTY_VALUE ;
 
if ( Close [i+ 1 +barsig]>lower[i+ 1 +barsig] && Close [i+barsig]<lower[i+barsig])
 upar[i] = Low [i]-arrots* Point ; else upar[i] = EMPTY_VALUE ; 
}
}
//--- return value of prev_calculated for next call
   return (rates_total);
  }
  

int GetRecalcIndex( int & total, const int ratesTotal, const int prevCalculated)
{
   total = ratesTotal - 2 - barsig;                                                                         
                                                   
   if (cb > 0 && cb < total)
      total = MathMin (cb, total);                      
                                                   
   if (prevCalculated < ratesTotal - 1 )                     
   {       
       InitializeBuffers();    // Это функция, которая должна заново инициализировать все индикаторные буфера, т. к. имеем дело с первой загрузкой индикатора или подкачкой истории
       return (total);
   }
   
   return ( MathMin (ratesTotal - prevCalculated, total));                            
}

void InitializeBuffers()
{
   ArrayInitialize (fx1, EMPTY_VALUE );
   ArrayInitialize (fx2, EMPTY_VALUE );
   ArrayInitialize (lower, EMPTY_VALUE );
   ArrayInitialize (upper, EMPTY_VALUE );
   ArrayInitialize (upar, EMPTY_VALUE );
   ArrayInitialize (dnar, EMPTY_VALUE );
   ArrayInitialize (hp, EMPTY_VALUE );
}
 
PolarSeaman :

Teşekkürler, ama hiçbir şey değişmedi. Sorun nedir?

Elbette sonuç değişmeyecek. Sonuçta, ana nedeni (cb döngüsü) ortadan kaldırmadınız. Bu döngü yanlış organize edilmiştir:

 for (i=cb; i>= 0 ; i--)

Kaldırmanız ve bunun yerine bir döngü sınırı koymanız gerekir. Her iki yerde.

 
Ihor Herasko :

Elbette sonuç değişmeyecek. Sonuçta, ana nedeni (cb döngüsü) ortadan kaldırmadınız. Bu döngü yanlış organize edilmiştir:

Bunu kaldırmanız ve bunun yerine bir döngü sınırı koymanız gerekir. Her iki yerde.

Böyle 3 döngü var, onları değiştirdim, terminal donuyor.

 

Ben yaptım donmuyor, kilitlenmiyor ama ilk tamponda (fx2) 3 değer var: fiyat, 0.0 ve 164874239.218492.

sell_1_B= NormalizeDouble ( iCustom ( Symbol (), 0 , "HiLo" , 1 , 1 ), Digits );

sell_1_B!=EMPTY_VALUE ve sell_1_B!=0 ise bu bir fiyat olduğu anlamına gelmez.

Sinyal nasıl alınır?