Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1445

 
Vitaly Muzichenko:

Grazie!

Ho provato e ho ottenuto un errore, sto facendo qualcosa di sbagliato:

Buffer[] è distribuito? Vedo la dichiarazione, ma non vedo l'impostazione delle dimensioni

 
Artyom Trishkin:

Buffer[] è distribuito? Vedo la dichiarazione, ma non vedo le dimensioni impostate

Imposta la dimensione, errore da qualche altra parte, non funziona.

 
Vitaly Muzichenko:

Imposta la dimensione, errore da qualche altra parte, non funziona.

Cosa stai trasmettendo?

 
Artyom Trishkin:

Che cosa stai trasmettendo?

   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, perché copiare la funzione dall'inluder? Non sarebbe più facile collegare una biblioteca?

#include <MovingAverages.mqh>
 
Vitaly Muzichenko:

In generale, rimuovete la chiamata a questa funzione dal ciclo. C'è già un ciclo completo in questa funzione. All'inizio dovete passare l'inizio dei dati significativi nell'array, in base ai quali state facendo lo smoothing. Per alcuni tipi di lisciatura è necessario un pre-calcolo. Per la SMMA si tratta di due periodi di calcolo.

 
Artyom Trishkin:

In generale, rimuovete la chiamata a questa funzione dal ciclo. C'è già un ciclo completo in questa funzione. All'inizio, dovete passare l'inizio dei dati significativi nell'array, in base ai quali state facendo lo smoothing. Per alcuni tipi di lisciatura è necessario un pre-calcolo. Per la SMMA si tratta di due periodi di calcolo.

Ma quando viene aggiunta una nuova barra, l'intero array non viene ricalcolato? E quando il valore corrente nell'array cambia, anche il buffer verrebbe ricalcolato. Come, allora, senza il ciclo?

Una volta all'inizio dell'indicatore, attraverso l'intero buffer, e poi solo l'ultimo indice su ogni tick? Questa è un'improvvisata. Non l'ho ancora fatto... devo controllare.

 
Alexey Viktorov:

E in questo caso, quando viene aggiunta una nuova barra, l'intero array non verrà ricalcolato? E non sarebbe male nemmeno ricalcolare quando il valore corrente nell'array del buffer cambia. In questo caso, come possiamo evitare il loop?

Una volta all'inizio dell'indicatore, attraverso l'intero buffer, e poi solo l'ultimo indice su ogni tick? Questa è un'improvvisata. Non l'ho ancora fatto... devo controllare.

Bene, guardate il codice - Vitaly l'ha direttamente esposto

 
Artyom Trishkin:

Beh, guardate il codice - Vitaly l'ha postato direttamente

Ora sono venuto a fare il debug del costrutto "SmoothedMAOnBuffer()" in mt4.

Non capisco cosa c'è che non va

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:

Ora sono arrivato al debugging del costrutto "SmoothedMAOnBuffer()" in mt4.

Cosa c'è che non va, non lo capisco per niente

Rimuovere dal ciclo
Motivazione: