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

 
Vitaly Muzichenko :

Teşekkür ederim!

Denedim ve bir hata aldım, yanlış bir şey yapıyorum:

arabellek[] ayrılmış mı? Reklamı görüyorum, ancak boyut ayarını göremiyorum

 
Artyom Trishkin :

arabellek[] ayrılmış mı? Reklamı görüyorum, ancak boyut ayarını göremiyorum

Boyutu ayarladım, hata hala bir yerde, çalışmıyor.

 
Vitaly Muzichenko :

Boyutu ayarladım, hata hala bir yerde, çalışmıyor.

Başlamak için neyi geçiyorsun ?

 
Artyom Trishkin :

Başlamak için neyi geçiyorsun ?

   double Array_1[];
   double Array_2[];
   ArraySetAsSeries (close, true );
   int count = rates_total- 1 ;
   if (count < 0 )
       return (- 1 );
   int i = 1 ;
   int period = ( int ) MathFloor ( MathSqrt (a));
   int val_1 = ( int ) MathFloor (a / 1.9 );
   int counter = Bars ( _Symbol , _Period ) - count + a + 1 ;
   if (counter > Bars ( _Symbol , _Period ))
      counter = Bars ( _Symbol , _Period );
   // ArraySetAsSeries(Array_1, true);
   ArrayResize (Array_1, counter);
   // ArraySetAsSeries(Array_2, true);
   ArrayResize (Array_2, counter);
   double d_close = close[ 1 ];
   double buff[];
   ArrayResize (buff, counter);
   for (i = 0 ; i < counter; i++)
      Array_1[i] = 2.0 * ma_1(i, val_1) - ma_1(i, a);
   for (i = 0 ; i < counter - a; i++) {
       // buf_3[i] = iMAOnArray(Array_1, 0, period, 0, MODE_SMMA, i);
       // buf_3[i] = iMA(NULL, 0, period, 0, MODE_SMMA, PRICE_LOW);
       //  CopyBuffer(10,0,i,1,buff);
      SmoothedMAOnBuffer(counter, prev_calculated, i, period, Array_1, buff);
      buf_3[i] = buff[ 0 ];
      }
     .....

//+------------------------------------------------------------------+
int SmoothedMAOnBuffer( const int rates_total, const int prev_calculated, const int begin, const int period, const double & price[], double & buffer[])
{
//--- check period
   if (period<= 1 || period>(rates_total-begin))
       return ( 0 );
//--- save as_series flags
   bool as_series_price= ArrayGetAsSeries (price);
   bool as_series_buffer= ArrayGetAsSeries (buffer);
   ArraySetAsSeries (price, false );
   ArraySetAsSeries (buffer, false );
//--- calculate start position
   int start_position;
   if (prev_calculated== 0 ) { // first calculation or number of bars was changed
       //--- set empty value for first bars
      start_position=period+begin;
       for ( int i= 0 ; i<start_position- 1 ; i++)
         buffer[i]= 0.0 ;
       //--- calculate first visible value
       double first_value= 0 ;
       for ( int i=begin; i<start_position; i++)
         first_value+=price[i];
      buffer[start_position- 1 ]=first_value/period;
   } else
      start_position=prev_calculated- 1 ;
//--- main loop
   for ( int i=start_position; i<rates_total; i++)
       buffer[i]=(buffer[i- 1 ]*(period- 1 )+price[i] )/period;
//--- restore as_series flags
   ArraySetAsSeries (price,as_series_price);
   ArraySetAsSeries (buffer,as_series_buffer);
//---
   return (rates_total);
}
 
Vitaly Muzichenko :

Vitaly, neden dahil etme işlevinden kopyalasın? Kütüphaneyi dahil etmek daha kolay değil mi?

 #include <MovingAverages.mqh>
 
Vitaly Muzichenko :

Genel olarak, bu işleve yapılan çağrıyı döngüden kaldırın. Zaten kendi içinde tam bir döngüye sahiptir. Başlangıçta, düzleştirme yaptığınız dizideki önemli verilerin başlangıcını iletmeniz gerekir. Bazı kenar yumuşatma türleri için bir ön hesaplama gereklidir. SMMA için bu, yaklaşık olarak iki hesaplama periyodudur.

 
Artyom Trishkin :

Genel olarak, bu işleve yapılan çağrıyı döngüden kaldırın . Zaten kendi içinde tam bir döngüye sahiptir. Başlangıçta, düzleştirme yaptığınız dizideki önemli verilerin başlangıcını iletmeniz gerekir. Bazı kenar yumuşatma türleri için bir ön hesaplama gereklidir. SMMA için bu, yaklaşık olarak iki hesaplama periyodudur.

Ve bu durumda, yeni bir çubuk eklerken tüm dizi yeniden hesaplanmayacak mı? Evet ve arabellek dizisindeki mevcut değeri değiştirirken yeniden hesaplamanın zararı olmaz. Ve sonra nasıl bir döngü olmadan?

Göstergeyi tüm arabellek üzerinde başlatırken ve ardından her onaydaki yalnızca son dizin? Bu doğaçlama. Bunu henüz yapmadım... Kontrol etmem gerekecek.

 
Alexey Viktorov :

Ve bu durumda, yeni bir çubuk eklerken tüm dizi yeniden hesaplanmayacak mı? Evet ve arabellek dizisindeki mevcut değeri değiştirirken yeniden hesaplamanın zararı olmaz. Ve sonra nasıl bir döngü olmadan?

Göstergeyi tüm arabellek üzerinde başlatırken ve ardından her onaydaki yalnızca son dizin? Bu doğaçlama. Bunu henüz yapmadım... Kontrol etmem gerekecek.

Pekala, koda bakın - Vitaly doğrudan ortaya koydu

 
Artyom Trishkin :

Pekala, koda bakın - Vitaly doğrudan ortaya koydu

Şimdi MT4'teki "SmoothedMAOnBuffer()" yapısında hata ayıklamaya geldim.

Sorun ne, anlamı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[])
{
   double Array_1[];
   double Array_2[];
   int count = IndicatorCounted();
   if (count < 0 )
       return (- 1 );
   int i = 1 ;
   int period = ( int ) MathFloor ( MathSqrt (a));
   int val_1 = ( int ) MathFloor (a / 1.9 );
   int counter = Bars - count + a + 1 ;
   if (counter > Bars )
      counter = Bars ;
   ArraySetAsSeries (Array_1, TRUE);
   ArrayResize (Array_1, counter);
   ArraySetAsSeries (Array_2, TRUE);
   ArrayResize (Array_2, counter);
   double d_close = close[ 1 ];
   double buff[];
   ArrayResize (buff, counter);
   for (i = 0 ; i < counter; i++)
      Array_1[i] = 2.0 * ma_1(i, val_1) - ma_1(i, a);
   for (i = 0 ; i < counter - a; i++) {
     // buf_3[i] = iMAOnArray(Array_1, 0, period, 0, MODE_SMMA, i); // Так индикатор работает
       SmoothedMAOnBuffer(counter, prev_calculated, i, period, Array_1, buff); Совсем не работает, но и ошибок в журнале нет
       buf_3[i] = buff[ 0 ]; ???
   }
   for (i = counter - a; i > 0 ; i--) {
      Array_2[i] = Array_2[i + 1 ];
       if (buf_3[i] > buf_3[i + 1 ])
         Array_2[i] = 1 ;
       if (buf_3[i] < buf_3[i + 1 ])
         Array_2[i] = - 1 ;
       if (Array_2[i] > 0.0 ) {
         buf_1[i] = buf_3[i];
         if (Array_2[i + 1 ] < 0.0 )
            buf_1[i + 1 ] = buf_3[i + 1 ];
         if (Array_2[i + 1 ] < 0.0 ) {
         }
         buf_2[i] = EMPTY_VALUE ;
      } else {
         if (Array_2[i] < 0.0 ) {
            buf_2[i] = buf_3[i];
             if (Array_2[i + 1 ] > 0.0 )
               buf_2[i + 1 ] = buf_3[i + 1 ];
             if (Array_2[i + 1 ] > 0.0 ) {
            }
            buf_1[i] = EMPTY_VALUE ;
         }
      }
   }
   for (i = 0 ; i < counter- 1 ; i++) {
       if (buf_2[i + 1 ] == EMPTY_VALUE && buf_2[i] != EMPTY_VALUE )
         buf_4[i] = buf_2[i];
       if (buf_1[i + 1 ] == EMPTY_VALUE && buf_1[i] != EMPTY_VALUE )
         buf_5[i] = buf_1[i];
   }
   return (rates_total);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int SmoothedMAOnBuffer( const int rates_total, const int prev_calculated, const int begin, const int period, const double & price[], double & buffer[])
{
//--- check period
   if (period<= 1 || period>(rates_total-begin))
       return ( 0 );
//--- save as_series flags
   bool as_series_price= ArrayGetAsSeries (price);
   bool as_series_buffer= ArrayGetAsSeries (buffer);
   ArraySetAsSeries (price, false );
   ArraySetAsSeries (buffer, false );
//--- calculate start position
   int start_position;
   int i= 0 ;
   if (prev_calculated== 0 ) { // first calculation or number of bars was changed
       //--- set empty value for first bars
      start_position=period+begin;
       for (i= 0 ; i<start_position- 1 ; i++)
         buffer[i]= 0.0 ;
       //--- calculate first visible value
       double first_value= 0 ;
       for (i=begin; i<start_position; i++)
         first_value+=price[i];
      buffer[start_position- 1 ]=first_value/period;
   } else
      start_position=prev_calculated- 1 ;
//--- main loop
   for (i=start_position; i<rates_total; i++)
      buffer[i]=(buffer[i- 1 ]*(period- 1 )+price[i])/period;
//--- restore as_series flags
   ArraySetAsSeries (price,as_series_price);
   ArraySetAsSeries (buffer,as_series_buffer);
//---
   return (rates_total);
}
 
Vitaly Muzichenko :

Şimdi MT4'te "SmoothedMAOnBuffer()" yapısında hata ayıklamaya geldim.

Sorun ne, anlamıyorum

Döngüden kaldır
Neden: