Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1445

 
Vitaly Muzichenko:

Merci !

J'ai essayé et j'ai eu une erreur, je fais quelque chose de mal :

Le tampon[] est-il distribué ? Je vois la déclaration, mais je ne vois pas le réglage de la taille.

 
Artyom Trishkin:

Le tampon[] est-il distribué ? Je vois la déclaration, mais je ne vois pas l'ensemble des dimensions.

Définir la taille, erreur ailleurs, ne fonctionne pas.

 
Vitaly Muzichenko:

Définir la taille, erreur ailleurs, ne fonctionne pas.

Que transmettez-vous?

 
Artyom Trishkin:

Qu'est-ce que vous transmettez?

   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, pourquoi copier la fonction de l'inluder ? Ne serait-il pas plus simple de brancher une bibliothèque ?

#include <MovingAverages.mqh>
 
Vitaly Muzichenko:

En général, supprimez l'appel à cette fonction de la boucle. Il y a déjà une boucle complète dans cette fonction. Pour commencer, vous devez transmettre le début des données significatives dans le tableau, sur la base desquelles vous effectuez le lissage. Pour certains types de lissage, vous avez besoin d'un pré-calcul. Pour le SMMA, il s'agit de deux périodes de calcul.

 
Artyom Trishkin:

En général, supprimez l'appel à cette fonction de la boucle. Il y a déjà une boucle complète dans cette fonction. Pour commencer, vous devez transmettre le début des données significatives dans le tableau, sur la base desquelles vous effectuez le lissage. Pour certains types de lissage, vous avez besoin d'un pré-calcul. Pour le SMMA, il s'agit de deux périodes de calcul.

Mais lorsqu'une nouvelle barre est ajoutée, le tableau entier ne sera-t-il pas recalculé ? Et lorsque la valeur actuelle du tableau change, le tampon est également recalculé. Dans ce cas, comment éviter la boucle ?

Une fois au début de l'indicateur, à travers tout le tampon, et ensuite seulement le dernier indice à chaque tick ? C'est un impromptu. Je ne l'ai pas encore fait... Je dois vérifier.

 
Alexey Viktorov:

Et dans ce cas, lorsqu'une nouvelle barre est ajoutée, l'ensemble du tableau ne sera-t-il pas recalculé ? Et il ne serait pas mal non plus de recalculer lorsque la valeur actuelle du tableau tampon change. Dans ce cas, comment éviter la boucle ?

Une fois au début de l'indicateur, à travers tout le tampon, et ensuite seulement le dernier indice à chaque tick ? C'est un impromptu. Je ne l'ai pas encore fait... Je dois vérifier.

Eh bien, regardez le code - Vitaly l'a directement exposé

 
Artyom Trishkin:

Eh bien, regardez le code - Vitaly l'a posté directement

Maintenant je suis venu pour déboguer la construction "SmoothedMAOnBuffer()" dans mt4.

Je ne comprends pas ce qui ne va pas.

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:

J'en suis maintenant à déboguer la construction "SmoothedMAOnBuffer()" dans mt4.

Qu'est-ce qui ne va pas, je ne comprends pas du tout.

Retirer de la boucle