Erreurs, bugs, questions - page 2470

 

Pourquoi en serait-il ainsi ?

IM      0       17:19:04.403    Terminal        MetaTrader 5 x64 build 2056 started (MetaQuotes Software Corp.)
NG      0       17:19:04.403    Terminal        Windows 7 Service Pack 1 (build 7601) x64, IE 11, AMD FX-4170 Quad-Core Processor , Memory: 9408 / 12255 Mb, Disk: 20 / 238 Gb, GMT+3

J'ai découvert aujourd'hui que le volume minimum dans la spécification de l'outil est de 100 et que le pas est également de 100. Cependant, il n'ouvre pas de positions avec l'erreur"Volume invalide". Si je règle 0,01, les boutons sont inactifs.

J'ai changé la version pour une version plus "jeune".

KK      0       17:35:14.046    Terminal        MetaTrader 5 x64 build 2025 started (MetaQuotes Software Corp.)
IE      0       17:35:14.046    Terminal        Windows 7 Service Pack 1 (build 7601) x64, IE 11, AMD FX-4170 Quad-Core Processor , Memory: 9182 / 12255 Mb, Disk: 20 / 238 Gb, GMT+3

pas de changement.

Puis je l'ai remplacé par la version finale.

FI      0       17:37:23.049    Terminal        MetaTrader 5 x64 build 2007 started (MetaQuotes Software Corp.)
RS      0       17:37:23.049    Terminal        Windows 7 Service Pack 1 (build 7601) x64, IE 11, AMD FX-4170 Quad-Core Processor , Memory: 9180 / 12255 Mb, Disk: 20 / 238 Gb, GMT+3

Et voici le résultat.



Pourquoi cela n'arrive-t-il qu'à une seule entreprise ? Si elle était répandue, le problème aurait été résolu depuis longtemps.

Quelle direction dois-je envoyer au soutien de l'entreprise ?


Ajouté : Il est très étrange que le build 2025 fonctionne bien sur un compte cent de la même société. Tous les paramètres de l'outil sont comme ils devraient être.

Vous pouvez négocier en cents. Je l'ai compris moi-même... ...mais je veux plus.

 
Ilyas:

Merci pour votre message.
C'est un rudiment, on va le réparer.

@Ilyas, il y a un problème similaire avec la structure NonPOD.

struct NonPod{
   uchar data[];
};   
   
void OnStart(){
   NonPod obj;
   
   obj = (NonPod)(obj);   // '(' - invalid cast operation	
}
 
Quelqu'un sait-il comment contourner cette limitation, à part attendre une nouvelle version avec le support des espaces de noms pour les classes ?
template<typename T>
class TestTypedef{
public:
   typedef void (* callback)(T &);    // 'callback' - identifier already used
   callback eq;
};


void ff(int&) {Print(__FUNCSIG__);}

void OnStart(){  

   TestTypedef<int> int_value;
   int_value.eq = ff;
   
   int x = 5;
   int_value.eq(x);                 // Ok

   TestTypedef<string> int_value;   //Compile error 'callback' - identifier already used
}

Problème dans la zone de déclaration de l'espace de noms global dans la fonctionnalitétypedef

 
MT5 (build 2057)

Erreur de compilation lors de l'utilisation répétée de la même signature de fonction dans un typedef :
typedef void (* callback_0)();     // а без этой строки все ОК
typedef void (* callback)();

void test_func(){}

void OnStart(){
   callback func_ptr = test_func;  //'test_func' - type mismatch
   func_ptr();
}
 
Sergey Dzyublik:
MT5 (build 2057)

Bug avec "interdiction" de réutiliser la même signature dans un typedef :

Et j'aiun script essentiellement similaire datant d'il y a plus de deux ans qui donne un résultat de 2056x32 : EX5 loading failed (échec du chargement).

 
Sergey Dzyublik:
Quelqu'un sait-il comment contourner cette restriction, à part attendre une nouvelle version avec le support des espaces de noms pour les classes ?

Compiler

void f(int&) {}
void OnStart()
{
   TestTypedef<int> int_value;
   TestTypedef<string> string_value;

c'est possible (et cela fonctionnera même), mais pas plus que cela : alors, disons que vous ne pouvez pas écrire

   int_value.eq = f;
}

alors n'écrivez pas comment

 
A100:

Compiler pour ne pas écrire comment

Nan, c'est toujours dur, mais ça marche...
Le type bool s'est perdu dans le typedef de l'exemple.

#define PRINT(x) ; Print(#x, ":", string(x))

#define  CREATE_TestTypedef(type)                              \
class TestTypedef_##type{                                     \
public:                                                       \
   typedef bool (* callback_##type)(type &);                  \
   callback_##type  eq;                                        \
}
   
bool f(int&) {return true;}


void OnStart(){
   CREATE_TestTypedef(int) int_value;
   CREATE_TestTypedef(string) string_value;                     
   
   int data = 5;
   int_value.eq = f;
   PRINT(int_value.eq(data));                    // result: true
}
 
Jusqu'à ce que les corrections de typedef et les mises à jour de l'espace de noms, le cas échéant, soient publiées,
nous devrons déclarer l'utilisation de chaque type séparément via des macros, et ensuite utiliser des macros pour obtenir le nom des classes générées pour créer un objet classe...
 

Expliquez pourquoi lorsque je créeCChartObjectLabel je ne supprime pas les objets dans l'indicateur lors de la désinitialisation dans ce code :

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_separate_window
#include <ChartObjects\ChartObjectsTxtControls.mqh>
CChartObjectLabel *LabelUP,*LabelDN;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   CreateLabel(LabelUP,"LabelUP",0);
   CreateLabel(LabelDN,"LabelDN",30);
/*   
   LabelUP=new CChartObjectLabel;
   LabelDN=new CChartObjectLabel;
   LabelUP.Create(0,"LabelUP",ChartWindowFind(),0,0);
   LabelUP.Color(clrYellow);
   LabelUP.FontSize(14);
   LabelUP.Description("LabelUP");
   
   LabelDN.Create(0,"LabelDN",ChartWindowFind(),0,10);
   LabelDN.Color(clrYellow);
   LabelDN.FontSize(14);
   LabelDN.Description("LabelDN");
*/
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   delete LabelUP;
   delete LabelDN;
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   return(rates_total);

  }
//+------------------------------------------------------------------+
void CreateLabel(CChartObjectLabel *l,string name,int y)
  {
   l=new CChartObjectLabel;
   l.Create(0,name,ChartWindowFind(),0,y);
   l.Color(clrYellow);
   l.FontSize(14);
   l.Description(name);
  }
//+------------------------------------------------------------------+

lorsque je change de TF, j'obtiens une entrée de journal : 2019.05.23 09:49:02.044 tstlabel EURUSD,M30 : 2 objets de type CChartObjectLabel restants

si l'on décommente dans OnInit() la création des étiquettes de texte (CChartObjectLabel), alors tout fonctionnera correctement.

Je passe un pointeur à la fonctionCreateLabel(), maisje ne peux pasle supprimer plus tard dansOnDeinit()

 
Igor Makanu:

Expliquez pourquoi lorsque je crée CChartObjectLabel je ne supprime pas les objets dans l'indicateur lors de la désinitialisation dans ce code :

lorsque je change de TF, j'obtiens une entrée de journal : 2019.05.23 09:49:02.044 tstlabel EURUSD,M30 : 2 objets de type CChartObjectLabel restants

si l'on décommente dans OnInit() la création des étiquettes de texte (CChartObjectLabel), alors tout fonctionnera correctement.

Je passe un pointeur à la fonctionCreateLabel(), maisje ne peux pasle supprimer plus tard dansOnDeinit()

Il crée un nouvel objet l. Et ce n'est pas supprimé.
Raison: