Ошибки, баги, вопросы - страница 2115

 
Andrey Voytenko:

Похоже, если использовать комментарий к позиции по максимуму (31 символ) то на отображение ID во всплывающей подсказке уже нет места.

Сразу и не догадаешься!
 

Доброго Дня!

Есть кто-то у кого советник который отправляет часто на email письма?

Сколько получается в час, в день?

У меня отправило 16 писем, минут за 5 и несколько часов в журнале пусто, а потом стало писать

Mail: not enough space for


У кого какой есть опыт на эту тему.

P.S. Gmail google позволяет получать письма ежесекундно , предполагаю что письма быстрее накапливаются в очередь терминала/сервера, а отправляются медленнее (насколько ?)

И в очередной раз советник/терминал пытается поставить письмо в очередь , а очередь уже переполнена!!!

 
Roni Iron:

Доброго Дня!

Есть кто-то у кого советник который отправляет часто на email письма?

Сколько получается в час, в день?

У меня отправило 16 писем, минут за 5 и несколько часов в журнале пусто, а потом стало писать

Mail: not enough space for


У кого какой есть опыт на эту тему.

P.S. Gmail google позволяет получать письма ежесекундно , предполагаю что письма быстрее накапливаются в очередь терминала/сервера, а отправляются медленнее (насколько ?)

И в очередной раз советник/терминал пытается поставить письмо в очередь , а очередь уже переполнена!!!


а зачем? давно уже придумали PUSH

 
fxsaber:

Ошибка в Документации


fxsaber:

Ошибка в Документации

Спасибо, поправим

 
A100:

Неоднократно встречал на форуме обсуждение пользователей об отсутствие в MetaEditor предопределенного макроса, аналогичного _WIN64. Ответ администрации был, что нет необходимости, поскольку MetaEditor генерирует универсальный одновременно 32-64-х разрядный код.

В то же время многие используют выравнивание https://www.mql5.com/ru/forum/225498/page2#comment_6401835 путем дополнения полей структуры

И действительно, если использовать готовую .dll (которую уже нельзя изменить) то без дополнительного выравнивания не обойтись. Но в x86 и x64 это дополнение может выглядеть по разному, а значит необходимость в аналоге _WIN64 все-таки есть, поскольку структура задается на этапе компиляции .mq5 файла где TerminalInfoInteger( TERMINAL_X64 ) не работает

Сейчас нужно лишнюю информацию держать в уме. В результате экономии на пустяке есть риск получить трудноуловимую ошибку

Вот пример от разработчиков - GetOpenFileName, которая работает в x64 и x86. Посмотрите, решает ли он вопрос

//+------------------------------------------------------------------+
//|                                                   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:

Вот пример от разработчиков - GetOpenFileName, которая работает в x64 и x86. Посмотрите, решает ли он вопрос

Фактически кода требует почти в два раза больше,

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

при том что программы с .dll не для массового сегмента
Опять же должен быть выбор: раздельная (32\64) компиляция и в 2 раза проще код
или универсальность и существенное усложение кода
И кроме того аналог _WIN64 можно ввести по принципу _IsX64 (не документирован но пользоваться можно)

 

Дополнительный аргумент - часто к проекту приложена только одна .dll (либо только x86, либо только x64) и нельзя в .mqh файле этого проекта задать строку вида

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

Пример из справки

//+------------------------------------------------------------------+ 
//| 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); 
  } 

Отсюда вопрос, как изменить заливку в OBJ_RECTANGLE  в мт 4  ???

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

Проблема с поддержкой 32 битных dll отпадет автоматически.
 

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

Желательно к этому моменту исправить все известные ошибки возникающие при выполнении, например эту #1841289 https://www.mql5.com/ru/forum/1111/page2025#comment_5766707

Поведение этого и других operator не соответствует методам. При том что operator по отношению к методам является не более чем синтаксическим сахаром

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