Erreurs, bugs, questions - page 2115

 

Bonjour !

Est-ce que quelqu'un a un EA qui envoie fréquemment des emails ?

Combien en obtenez-vous par heure, par jour ?

J'ai envoyé 16 e-mails en 5 minutes et le journal était vide pendant quelques heures, puis il a commencé à écrire

Courrier : pas assez d'espace pour


Qui a une expérience en la matière ?

P.S. Gmail google vous permet de recevoir des emails toutes les secondes, je suppose que les emails s'accumulent plus vite dans la file d'attente du terminal/serveur et sont envoyés plus lentement (de combien ?).

Et une fois de plus, le conseiller/terminal essaie de mettre l'email en file d'attente, et la file d'attente est déjà pleine ! !!

 
Roni Iron:

Bonjour !

Est-ce que quelqu'un a un EA qui envoie fréquemment des emails ?

Combien en obtenez-vous par heure, par jour ?

J'ai envoyé 16 e-mails en 5 minutes et le journal était vide pendant quelques heures, puis il a commencé à écrire

Courrier : pas assez d'espace pour


Qui a une expérience en la matière ?

P.S. Gmail google permet de recevoir des emails toutes les secondes, je suppose que les emails s'accumulent plus vite dans la file d'attente du terminal/serveur et sont envoyés plus lentement (de combien ?).

Et une fois de plus, le conseiller/terminal essaie de mettre l'email en file d'attente, et la file d'attente est déjà pleine ! !!


Pourquoi ? Ils ont inventé PUSH il y a longtemps.

 
fxsaber:

Erreur dans la documentation


fxsaber:

Erreur dans la documentation

Merci, nous allons le corriger.

 
A100:

J'ai rencontré à plusieurs reprises des discussions sur le forum d'utilisateurs concernant l'absence d'une macro prédéfinie similaire à _WIN64 dans MetaEditor. La réponse de l'administration a été qu'il n'y a pas besoin car MetaEditor génère du code universel 32-64 bit en même temps.

En même temps, de nombreuses personnes utilisent l'alignement https://www.mql5.com/ru/forum/225498/page2#comment_6401835 en ajoutant les champs à la structure

Et en effet, si vous utilisez un fichier .dll prêt à l'emploi (qui ne peut plus être modifié), vous ne pouvez pas vous passer d'un alignement supplémentaire. Mais en x86 et x64, cette addition peut être différente, ce qui signifie que l'analogue _WIN64 est toujours nécessaire car la structure est définie à l'étape de la compilation du fichier .mq5 où TerminalInfoInteger( TERMINAL_X64 ) ne fonctionne pas.

Maintenant, nous devons garder à l'esprit des informations supplémentaires. En économisant sur une bagatelle, il y a un risque d'obtenir une erreur insaisissable.

Voici un exemple fourni par les développeurs - GetOpenFileName qui fonctionne en x64 et x86. Voir si cela résout le problème

//+------------------------------------------------------------------+
//|                                                   GetOpenFileName|
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+

struct SNativeStr64;
struct SNativeStr32;

#import "kernel32.dll"
int  GetLastError();
//--- x64
long LocalAlloc(uint flags,long uBytes);
void LocalFree(long memptr);
int  lstrlenW(long ptr);    // 64 bit
long lstrcpyW(long dst,const string src);
long lstrcpyW(string &dst,long src);

//--- x86
int  LocalAlloc(uint flags,int uBytes);
void LocalFree(int memptr);
int  lstrcpyW(int dst,const string src);
int  lstrlenW(int ptr);     // 32 bit
int  lstrcpyW(string &dst,int src);
#import

#define  OFN_PATHMUSTEXIST  0x00000800
#define  OFN_FILEMUSTEXIST  0x00001000
#define  OFN_HIDEREADONLY   0x00000004
#define  LMEM_ZEROINIT      0x40

struct OPENFILENAME32;
struct OPENFILENAME64;

#import "Comdlg32.dll"
int GetOpenFileNameW(OPENFILENAME64 &ofn);
int GetOpenFileNameW(OPENFILENAME32 &ofn);
#import
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template<typename T>
struct SNativeStr
  {
private:
                     SNativeStr(const SNativeStr &) { }

protected:
   T                 ptr;

public:
                     SNativeStr():ptr(0) { }
                    ~SNativeStr() { Clear(); }
   void              Clear(void) { if(ptr!=0) { LocalFree(ptr); ptr=0; } }
   T                 Detach(void) { T p=ptr; ptr=0; return(p); }

   int               Length(void) const { return(ptr==0?0:kernel32::lstrlenW(ptr)); }
   bool              Reserv(uint length) { Clear(); return((ptr=LocalAlloc(LMEM_ZEROINIT,T(sizeof(ushort)*(length+1))))!=0); }
   void              operator=(const string str)
     {
      Clear();
      ptr=LocalAlloc(LMEM_ZEROINIT,T(sizeof(ushort)*(StringLen(str)+2)));
      lstrcpyW(ptr,str);
     }
   bool              GetValue(string &str)
     {
      if(ptr==0)
         str=NULL;
      else
        {
         if(!StringInit(str,Length()))
            return(false);
         lstrcpyW(str,ptr);
        }
      //---
      return(true);
     }
  };

struct SNativeStr64 : public SNativeStr<long> { };
struct SNativeStr32 : public SNativeStr<int>  { };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
struct OPENFILENAME64
  {
   uint              lStructSize;
   uint              dummy1;
   long              hwndOwner;
   long              hInstance;
   SNativeStr64      lpstrFilter;
   SNativeStr64      lpstrCustomFilter;
   uint              nMaxCustFilter;
   uint              nFilterIndex;
   SNativeStr64      lpstrFile;
   uint              nMaxFile;
   uint              dummy2;
   SNativeStr64      lpstrFileTitle;
   uint              nMaxFileTitle;
   uint              dummy3;
   SNativeStr64      lpstrInitialDir;
   SNativeStr64      lpstrTitle;
   uint              Flags;
   ushort            nFileOffset;
   ushort            nFileExtension;
   SNativeStr64      lpstrDefExt;
   long              lCustData;
   long              lpfnHook;
   long              lpTemplateName;
   long              pvReserved;
   uint              dwReserved;
   uint              FlagsEx;
   
   OPENFILENAME64()
      : lStructSize(sizeof(OPENFILENAME64))
      , dummy1(0)
      , hwndOwner(0)
      , hInstance(0)
      , nMaxCustFilter(0)
      , nFilterIndex(0)
      , nMaxFile(0)
      , dummy2(0)
      , nMaxFileTitle(0)
      , dummy3(0)
      , Flags(0)
      , nFileOffset(0)
      , nFileExtension(0)
      , lCustData(0)
      , lpfnHook(0)
      , lpTemplateName(0)
      , pvReserved(0)
      , dwReserved(0)
      , FlagsEx(0)
     {
     }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
struct OPENFILENAME32
  {
   uint              lStructSize;
   int               hwndOwner;              // HWND
   int               hInstance;              // HINSTANCE
   SNativeStr32      lpstrFilter;
   SNativeStr32      lpstrCustomFilter;
   uint              nMaxCustFilter;
   uint              nFilterIndex;
   SNativeStr32      lpstrFile;
   int               nMaxFile;
   SNativeStr32      lpstrFileTitle;
   uint              nMaxFileTitle;
   SNativeStr32      lpstrInitialDir;
   SNativeStr32      lpstrTitle;
   uint              Flags;
   ushort            nFileOffset;
   ushort            nFileExtension;
   SNativeStr32      lpstrDefExt;
   int               lCustData;
   int               lpfnHook;
   int               lpTemplateName;
   int               pvReserved;
   uint              dwReserved;
   uint              FlagsEx;
   
   OPENFILENAME32()
      : lStructSize(sizeof(OPENFILENAME32))
      , hwndOwner(0)
      , hInstance(0)
      , nMaxCustFilter(0)
      , nFilterIndex(0)
      , nMaxFile(0)
      , nMaxFileTitle(0)
      , Flags(0)
      , nFileOffset(0)
      , nFileExtension(0)
      , lCustData(0)
      , lpfnHook(0)
      , lpTemplateName(0)
      , pvReserved(0)
      , dwReserved(0)
      , FlagsEx(0)
     {
     }            
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool GetOpenFileName(string &path,const string filter,const string initial_dir,const string title)
  {
   int res;

   if(_IsX64)
     {
      OPENFILENAME64 ofn;

      ofn.lStructSize=(uint)sizeof(ofn);
      ofn.lpstrFile.Reserv(1024);
      ofn.nMaxFile   =1024;
      ofn.Flags      =OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
      ofn.lpstrFilter=filter;
      ofn.lpstrInitialDir=initial_dir;
      ofn.lpstrTitle=title;

      if((res=GetOpenFileNameW(ofn))==1)
        {
         StringInit(path,1024);
         ofn.lpstrFile.GetValue(path);
        }
     }
   else
     {
      OPENFILENAME32 ofn;

      ofn.lStructSize=(uint)sizeof(ofn);
      ofn.lpstrFile.Reserv(1024);
      ofn.nMaxFile   =1024;
      ofn.Flags      =OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
      ofn.lpstrFilter=filter;
      ofn.lpstrInitialDir=initial_dir;
      ofn.lpstrTitle=title;

      if((res=GetOpenFileNameW(ofn))==1)
        {
         StringInit(path,1024);
         ofn.lpstrFile.GetValue(path);
        }
     }
//---
   return(res!=0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   string path;
   if(GetOpenFileName(path,"Source code\0*.mq5\0",TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL5\\Experts\\","Select source file"))
      Print(path);
   else
      PrintFormat("Failed with error: %x",kernel32::GetLastError());
  }
//+------------------------------------------------------------------+
 
Rashid Umarov:

Voici un exemple fourni par les développeurs - GetOpenFileName, qui fonctionne en x64 et x86. Voir si cela résout le problème

En fait, elle nécessite presque deux fois plus de code,

void OnStart()
{
    _IsX64 ? OnStart64() : OnStart32();
}

alors que les programmes avec .dll ne sont pas pour le segment de masse
Encore une fois, il faut faire un choix : compilation fractionnée (32\64) et deux fois plus de code.
ou l'universalité et une complication considérable du code.
En outre, vous pouvez introduire l'analogue de _WIN64 selon le principe _IsX64 (il n'est pas documenté mais vous pouvez l'utiliser).

 

Un argument supplémentaire est que souvent il n'y a qu'un seul .dll attaché à un projet (soit x86 seulement ou x64 seulement) et vous ne pouvez pas spécifier une ligne comme celle-ci dans le fichier .mqh de ce projet

#ifndef _WIN64
Не_поддерживается
#endif
Par exemple ici https://www.mql5.com/ru/forum/224745
ATcl - интерпретатор Tcl для MT4
ATcl - интерпретатор Tcl для MT4
  • 2018.01.15
  • www.mql5.com
Праздники прошли плодотворно, и представляю на суд общественности ATcl - встроенный интерпретатор Tcl в MT4...
 

Exemple d'aide

//+------------------------------------------------------------------+ 
//| Cоздает прямоугольник по заданным координатам                    | 
//+------------------------------------------------------------------+ 
bool RectangleCreate(const long            chart_ID=0,        // ID графика 
                     const string          name="Rectangle",  // имя прямоугольника 
                     const int             sub_window=0,      // номер подокна  
                     datetime              time1=0,           // время первой точки 
                     double                price1=0,          // цена первой точки 
                     datetime              time2=0,           // время второй точки 
                     double                price2=0,          // цена второй точки 
                     const color           clr=clrRed,        // цвет прямоугольника 
                     const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий прямоугольника 
                     const int             width=1,           // толщина линий прямоугольника 
                     const bool            fill=false,        // заливка прямоугольника цветом            < --- Есть только тут  дальше в коде нет
                     const bool            back=false,        // на заднем плане 
                     const bool            selection=true,    // выделить для перемещений 
                     const bool            hidden=true,       // скрыт в списке объектов 
                     const long            z_order=0)         // приоритет на нажатие мышью 
  { 
//--- установим координаты точек привязки, если они не заданы 
   ChangeRectangleEmptyPoints(time1,price1,time2,price2); 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим прямоугольник по заданным координатам 
   if(!ObjectCreate(chart_ID,name,OBJ_RECTANGLE,sub_window,time1,price1,time2,price2)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать прямоугольник! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- установим цвет прямоугольника 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- установим стиль линий прямоугольника 
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); 
//--- установим толщину линий прямоугольника 
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- включим (true) или отключим (false) режим выделения прямоугольника для перемещений 
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект 
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection 
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
//--- установим приоритет на получение события нажатия мыши на графике 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
//--- успешное выполнение 
   return(true); 
  } 

D'où la question : comment changer le remplissage deOBJ_RECTANGLE dans mt 4 ?

 
Nous avons l'intention d'arrêter complètement le développement des versions 32 bits de Metatrader d'ici peu.

Le problème du support des dll 32 bits disparaîtra automatiquement.
 

Renat Fatkhullin:
Мы нацелены вообще скоро остановить разработки 32 битных версий Метатрейдера.

Il est conseillé de corriger toutes les erreurs d'exécution connues à ce stade, par exemple la #1841289 https://www.mql5.com/ru/forum/1111/page2025#comment_5766707.

Le comportement de cet opérateur et des autres opérateurs ne correspond pas aux méthodes. L'opérateur While par rapport aux méthodes n'est rien d'autre qu'un sucre syntaxique.

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.09.15
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 

Lesarguments de la fonction ne sont pas calculés de droite à gauche

int i = 0;
int _etLastError() { return i; }
int _tringGetCharacter( string, int ) { i = 5041; return 0; }
void OnStart()
{
    string abc = "ABC";
    ResetLastError();
    Print( ::StringGetCharacter( abc, 1024 ), ":", GetLastError()); //(*)слева направо
    Print(   _tringGetCharacter( abc, 1024 ), ":", _etLastError()); //   справа налево
}

Résultat de la chaîne (*) : 0:5041

Prévu dans les deux cas : 0:0

Raison: