Erreurs, bugs, questions - page 561

 

Le code ArrayInitialize ne fonctionne pas est joint, si on décommente la boucle, tout est normal.

Et lorsque l'on déclare des variables dans une classe et un indicateur au niveau global avec le même nom, un avertissement apparaît.

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Line1
#property indicator_label1  "Line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Line2
#property indicator_label2  "Line2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         Line1Buffer[];
double         Line2Buffer[];
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,Line1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,Line2Buffer,INDICATOR_DATA);
   ArraySetAsSeries(Line1Buffer,true) ;
   ArraySetAsSeries(Line2Buffer,true) ;
   ArrayInitialize(Line1Buffer,EMPTY_VALUE) ;
   ArrayInitialize(Line2Buffer,EMPTY_VALUE);
   return(0);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
      ArraySetAsSeries(price,true) ;
      int i ;
     /* for(i=0; i<rates_total;i++)
         {
            Line1Buffer[i]=EMPTY_VALUE;
            Line2Buffer[i]=EMPTY_VALUE ;
         }*/
      for(i=0;i<100;i++)
         {
            Line1Buffer[i]=price[i] ;
         }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Pendant le week-end, alors qu'il n'y avait pas de ticks, j'ai débogué l'indicateur sur des comptes de démonstration, en l'exécutant sur la dernière version de deux instances du terminal MT5, mais de sociétés différentes : MetaQuotes et EGlobal. Les paramètres sont les mêmes partout. Pour être sûr, je l'ai vérifié hors ligne, donc le facteur tic est exclu.

Le problème est que le code le plus simple du "sous-indicateur" (sans parler de l'indicateur à part entière, plus complexe) affiche un nombre différent de résultats dans les différents terminaux des différentes entreprises :

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];
int handle;

int OnInit()
  {
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);

   handle=iFractals(_Symbol,PERIOD_CURRENT);
   if(handle==INVALID_HANDLE) return(-1);

   return(0);
  }

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[])
  {
   Print(1);

   return(rates_total);
  }

1. EGlobal. 2. MetaQuotes.EGlobalMetaQuotes

J'ai complètement déchargé les deux terminaux (vérifié avec le gestionnaire de tâches par les processus de mémoire), je les ai rechargés et j'ai recompilé les deux codes, juste au cas où. En fin de compte - aucun changement.

 
Ce n'est pas surprenant, c'est comme ça que ça doit être.
 

MathRound() fonctionne différemment en 4 et 5, et devrait être le même.

Le code 4p's :

int start()
{
  double minlot=0.01;
  double step  =0.01;
  Print(minlot+step*MathRound((0.005 - minlot)/step));
  return(0);
}

Code de 5 secondes :

void OnStart()
{
  double minlot=0.01;
  double step  =0.01;
  Print(minlot+step*MathRound((0.005 - minlot)/step));
}
 
joo:

MathRound() fonctionne différemment en 4 et 5, et devrait être le même.

Code de 4 secondes :

Code de 5 secondes :

Le problème est là :

  double y=MathRound(-0.5);
  Print("Округление -0.5 до ",y);

Cette valeur est arrondie différemment en 4 et 5.

 
Loky:
Pas de surprise, c'est comme ça que ça doit être.
Et plus précisément ?
 

Pourquoi MT5 ne sauvegarde-t-il pas l'historique des ordres, etc., si le test est interrompu ? Dans MT4, il a été sauvegardé.

De plus, il n'y a pas de positionnement dans l'historique des ordres à partir du graphique d'essai - il était pratique de visualiser les ordres dans la zone des grands rabattements en cliquant sur le graphique.

 

Bonsoir.

Pouvez-vous m'expliquer, s'il vous plaît, comment fonctionne la méthode SLeep() ?

Il devrait mettre le conseiller expert en pause pendant un certain temps, ou est-ce que je me trompe ?


{for (int sleep=0;sleep<10000;sleep++)

si(BarsCalculated(Handle)>=o_bars_reoptimizate)

{ Print(BarsCalculated(Handle)) ; break ; } sinon Sleep(100);}

Pour ce code, j'attends le résultat suivant : si le nombre de barres calculé pour un certain indicateur est supérieur à une certaine valeur, la boucle est interrompue ; sinon, l'exécution du code est retardée de 100 ms. Le délai total possible est de 100*10000ms....C'est un délai suffisant pour le calcul de l'indicateur. Alors pourquoi le code continue à s'exécuter (qui suit ce cycle) ? ou dans le testeur, cette fonction ne fonctionne pas comme je le suppose. Merci d'avance pour cette clarification.

 
mi__x__an:

Bonsoir.

Pouvez-vous m'expliquer, s'il vous plaît, comment fonctionne la méthode SLeep() ?

Il devrait mettre le conseiller expert en pause pendant un certain temps, ou est-ce que je me trompe ?


{for (int sleep=0;sleep<10000;sleep++)

si (BarsCalculated(Handle)>=o_bars_reoptimizate)

{ Print(BarsCalculated(Handle)) ; break ; } sinon Sleep(100);}

Pour ce code, j'attends le résultat suivant : si le nombre de barres calculé pour un certain indicateur est supérieur à une certaine valeur, la boucle est interrompue ; sinon, l'exécution du code est retardée de 100 ms. Le délai total possible est de 100*10000ms....C'est un délai suffisant pour le calcul de l'indicateur. Alors pourquoi le code continue à s'exécuter (qui suit ce cycle) ou dans le testeur, cette fonction ne fonctionne pas comme je le suppose. Merci d'avance pour cette clarification.

Le sommeil ne fonctionne pas dans les indicateurs
 

La documentation, par exemple, de CopyBuffer, provoque des secousses cérébrales : "Si vous souhaitez effectuer une copie partielle des valeurs de l'indicateur dans un autre tableau (pas le tampon de l'indicateur), vous devez utiliser le tableau intermédiaire à cette fin, dans lequel les valeurs requises sont copiées. Et déjà à partir de ce tableau intermédiaire, copier élément par élément le nombre requis de valeurs aux bons endroits du tableau récepteur. "

int  CopyBuffer(
   int       indicator_handle,     // handle индикатора
   int       buffer_num,           // номер буфера индикатора
   [...]
   );

Si lenuméro de tampon est explicitement mentionné, la nécessité de lier au préalable le tableau récepteur au tampon indicateur avec l'un ou l'autre numéro de séquence par le biais de SetIndexBuffer est certainement implicite. Mais,"si nous voulons copier certaines valeurs de l'indicateur dans un autre tableau (pas le tampon de l'indicateur)", nous ne pouvons pas parler debuffer_num, parce que ce n'est pas un indicateur, et nous ne l'avons pas relié à quoi que ce soit par définition.

Une contradiction ?

Ambiguïté ?

Ou peut-être suis-je complètement programmé ?

J'ai essayé de trouver une définition claire d'un tampon indicateur et j'ai échoué. S'agit-il vraiment d'un tampon lié via SetIndexBuffer ou cela ne suffit pas et ce devrait être un tableau avec l'identifiant INDICATOR_DATA?