Erreurs, bugs, questions - page 1838

 
Renat Fatkhullin:

C'est normal et tout à fait correct.

Utilisez ArraySize pour les objets dynamiques et appliquez sizeof uniquement aux objets statiques.

Merci ! Veuillez amener l'aide à se conformer à cette recommandation.
 

Lisez la documentation jusqu'au bout

Вычисления размера происходит на этапе компиляции.

 

Je demande de l'aide, je suis moi-même en panne. J'ai écrit ce script pour expliquer.

struct STRUCT 
{
  int a;
};

class CLASS
{
public:
  int a;
};

STRUCT f1()
{  
  static int i = 0;
  
  STRUCT Res;
  
  Res.a = i++;   
  
  return(Res);
}

CLASS* f2()
{
  static int i = 0;
  
  CLASS* Res = new CLASS;
  
  Res.a = i++;
  
  return(Res);
}

void OnStart()
{
  int i1 = f1().a + f1().a;  
  int i2 = f2().a + f2().a;
}

Il y a une structure et il y a une classe similaire. J'ai besoin qu'après le calcul i2, les objets de classe correspondants soient supprimés spontanément, comme cela se produit avec les objets de structure, lorsque le même calcul i1 est effectué. Comment faire ?

 

fxsaber:

Comment dois-je m'y prendre ?

Enveloppez-le dans un pointeur intelligent, je ne suis pas sûr que cela puisse être fait avec mql.
 
Комбинатор:
Enveloppez-le dans un pointeur intelligent, je ne suis pas sûr que cela puisse être fait par mql.
Le problème lui-même est dû à l'incapacité de retourner une structure complexe. Par exemple, si dans le code ci-dessus, au lieu de int a ;, on fait string a ;, alors f1() échouera au retour. C'est pourquoi mes yeux sont tombés sur les classes, mais là, le piège décrit m'attendait.
 

En général, vous pouvez surcharger le constructeur copy et l'opérateur=.

Cela ne fonctionnera pas pour les classes, elles sont censées être retournées par pointeur uniquement, les structures peuvent être retournées par valeur.

 
Комбинатор:

En général, vous pouvez surcharger le constructeur copy et l'opérateur=.

Cela ne fonctionnera pas pour les classes, elles sont censées être retournées par pointeur uniquement, les structures peuvent être retournées par valeur.

Merci ! Une restriction récemment levée m'a empêché d'appliquer cette solution. Maintenant, ça marche
struct STRUCT
{
  string Str;

  template <typename T>
  void operator =( const T Value )
  {
    Print(__FUNCTION__);
  }
  
  void operator =( const STRUCT &Struct )
  {
    this.Str = Struct.Str;
  }
};

STRUCT f()
{
  STRUCT Res;
  
  return(Res);
}

void OnStart()
{
  f() = 1;
}
 

Pendant l'optimisation du conseiller expert, j'obtiens l'erreur suivante

Le (0, 3) testé avec l'erreur "critical runtime error 512 in OnTimer function (sleep function reaches end of test)" à 0:37:20.429 + synchronisation de l'historique 0:00:43.395

Un seul test passe sans erreur.

La version de MT5 et de MetaEditor est 1571.

 
pivomoe:

Pendant l'optimisation du conseiller expert, j'obtiens l'erreur suivante

L'erreur "critical runtime error 512 in OnTimer function (sleep function reaches end of test)" à 0:37:20.429 + synchronisation de l'historique 0:00:43.395

Supprimez le maximum de code de l'Expert Advisor, afin que l'erreur soit reproductible. Et publier le code restant.

 

Bonjour. Je n'arrive pas à comprendre quel est le problème. Le robot ouvre des transactions dans le terminal MT4 et fonctionne comme il le devrait, mais dans le testeur, il ne veut pas le faire.

Voici la section du code responsable de l'ouverture d'une transaction :

   ArraySetAsSeries(MaxBuffer,true);
   ArraySetAsSeries(MinBuffer,true);
   ArraySetAsSeries(BufferExUp,true);
   ArraySetAsSeries(BufferExDown,true);
   ArraySetAsSeries(TimeBuffer,true);
   xMax=CopyHigh(_Symbol,_Period,1,NumBars+NBars+1,MaxBuffer);
   xMin=CopyLow(_Symbol,_Period,1,NumBars+NBars+1,MinBuffer);

   for(int i=NBars;i<=NumBars;i++)
     {
      xMaxH=ArrayMaximum(MaxBuffer,i,0);
      xMaxHD=ArrayMaximum(MaxBuffer,i+NBars,0);
      if((MaxBuffer[xMaxH]>=MaxBuffer[xMaxHD])&&(xMaxH>=NBars))
        {
         Maximum=MaxBuffer[xMaxH];
         for (int x=0; x<=OrdersTotal();x++)
          {if (OrderSelect(x,SELECT_BY_POS))
            {if (StringToDouble(OrderComment())==Maximum)
              {y=1;
               break;}
             else y=0;}}
       
         if (y==0)
           {int send1=OrderSend(Symbol(),OP_BUYSTOP,Volume1,Maximum,0,0,0,DoubleToString(Maximum,_Digits),0,0,Red);}}}

Le même code fonctionne dans MT5 et dans le testeur sans problèmes et se répète exactement (sauf pour OrderSend bien sûr et ArrayMaximum). Les problèmes sont apparus lorsque je l'ai transféré dans MT4, mais là encore, je ne comprends pas comment c'est possible car dans le terminal sur le graphique tout est OK.