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

 
avoitenko:

Билд 842/64 бит. При объявлении канвы:

появляется ошибка:

unresolved static variable 'CCanvas::m_default_colors'

Это только у меня одного такое?
Требования к размещению статических переменных изменились.

Ошибка возникла потому, что Вы используете объект со статическими переменными на глобальном уровне, и в этом случае компилятор требует явно разместить статический массив.
Это необходимо для того, что бы программист явно указал порядок инициализации статических членов класса/структуры.

В данном случае проблема заключается в том, что статический массив 'CCanvas::m_default_colors' может быть использован в конструкторе CCanvas на чтение и тогда, если он будет размещён и проинициализирован программистом после размещения объекта класса CCanvas, его значения в конструкторе CCanvas::CCanvas будут не теми, которые ожидаются. Поэтому компилятор проверяет, что бы статические члены класса/структуры были размещены и проинициализированы до использования объекта класса/структуры.

Мы подумаем, возможно что-то изменим.

Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
Документация по MQL5: Основы языка / Переменные / Создание и уничтожение объектов
  • www.mql5.com
Основы языка / Переменные / Создание и уничтожение объектов - Документация по MQL5
 

Продолжаю переход на мкуэл 5. В мт4 такой код проходил на ура. Сейчас проблема с коннектом к мускулу.

#import "libmysql.dll"
int mysql_init(int db);
int mysql_errno(int TMYSQL);
int mysql_real_connect( int TMYSQL,string host,string user,string password, string DB,int port,int socket,int clientflag);
int mysql_real_query(int TMSQL,string query,int length);
void mysql_close(int TMSQL);
#import

int i = 0;
int mysql;
string query;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
   mysql = mysql_init(mysql);
   if (mysql!=0) Print("allocated");
   string host="localhost";
   string user="root";
   string password="1111";
   string DB="fxdb";
   int clientflag=0;
   int port=3306;
   string socket="";
   int
   res=mysql_real_connect(mysql,host,user,password,DB,port, socket,clientflag);
   int err=GetLastError();
   if (res==mysql) Print("connected");
   else Print("error=",mysql," ",mysql_errno(mysql)," ");
   
 
   
   //mysql_real_query(mysql,query,length);
   //int myerr=mysql_errno(mysql);
   //if (myerr>0)Print("error=",myerr); else Print(i, "good"); 

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
      mysql_close(mysql);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   
  }
//+------------------------------------------------------------------+

Выдает ошибку:

2013.08.03 12:41:41    testMySql (AUDCAD,H1)    error=313111904 2005

Там предупреждение выводится о несоответствии типа переменной socket, ставлю NULL вместо переменной - не помогает. Еще я слышал что МТ5 как-то по особому строки передает в DLL. Из этой оперы? Как справиться, подскажите пожалуйста.

 
mql5:
Требования к размещению статических переменных изменились.
Поэтому компилятор проверяет, что бы статические члены класса/структуры были размещены и проинициализированы до использования объекта класса/структуры.
Спасибо. Теперь всё понятно.
 
Al_key:
Еще я слышал что МТ5 как-то по особому строки передает в DLL. Из этой оперы? Как справиться, подскажите пожалуйста.
В этой статье есть живой пример подключения к базе MySQL.
 
Еще вопрос: Установил впервые МТ5 стандартом, демо аккаунт - метаквотс. Смотрю из мажоров только 4 пары, USDCAD нет. Немного времени прошло, подгрузилось еще куча разных пар, в том числе и CFD и кнадец. Потом перешел на использование /portable. Естественно опять минимум пар по умолчанию, только в этот раз почему то не подгружаются другие, а мне демо USDCAD очень желательно в пятом МТ иметь.
 

Запоминаю ТФ, переключаю на М1, возвращаюсь на текущий.

Проблема: не могу запомнить присвоить текущий ТФ

int current_period_tf;
   string n;
   if(_Period==PERIOD_M1)  {current_period_tf=0x00000001;};
   if(_Period==PERIOD_M2)  {current_period_tf=0x00000002;};
   if(_Period==PERIOD_M3)  {current_period_tf=0x00000004;};
   if(_Period==PERIOD_M4)  {current_period_tf=0x00000008;};
   if(_Period==PERIOD_M5)  {current_period_tf=0x00000010;};
   if(_Period==PERIOD_M6)  {current_period_tf=0x00000020;};
   if(_Period==PERIOD_M10) {current_period_tf=0x00000040;};
   if(_Period==PERIOD_M12) {current_period_tf=0x00000080;};
   if(_Period==PERIOD_M15) {current_period_tf=0x00000100;};
   if(_Period==PERIOD_M20) {current_period_tf=0x00000200;};
   if(_Period==PERIOD_M30) {current_period_tf=0x00000400;};
   if(_Period==PERIOD_H1)  {current_period_tf=0x00000800;};
   if(_Period==PERIOD_H2)  {current_period_tf=0x00001000;};
   if(_Period==PERIOD_H3)  {current_period_tf=0x00002000;};
   if(_Period==PERIOD_H4)  {current_period_tf=0x00004000;};
   if(_Period==PERIOD_H6)  {current_period_tf=0x00008000;};
   if(_Period==PERIOD_H8)  {current_period_tf=0x00010000;};
   if(_Period==PERIOD_H12) {current_period_tf=0x00020000;};
   if(_Period==PERIOD_D1)  {current_period_tf=0x00040000;};
   if(_Period==PERIOD_W1)  {current_period_tf=0x00080000;};
   if(_Period==PERIOD_MN1) {current_period_tf=0x00100000;};
   ChartSetSymbolPeriod(ChartID(),_Symbol,PERIOD_M1);
   ObjectSetInteger(0,n,OBJPROP_TIMEFRAMES,current_period_tf);
   ChartSetSymbolPeriod(ChartID(),_Symbol,current_period_tf);

Переключиться на М1 получается

ChartSetSymbolPeriod(ChartID(),_Symbol,PERIOD_M1);

Для объекта

ObjectSetInteger(0,n,OBJPROP_TIMEFRAMES,current_period_tf);

работает. Для чарта

ChartSetSymbolPeriod(ChartID(),_Symbol,current_period_tf);

компилятор выдаёт

'current_period_tf' - can't convert enum

Что за загадка?

upd преобразовывать через строку и типы менять пробовал, не получается.

 
Al_key:
Еще вопрос: Установил впервые МТ5 стандартом, демо аккаунт - метаквотс. Смотрю из мажоров только 4 пары, USDCAD нет. Немного времени прошло, подгрузилось еще куча разных пар, в том числе и CFD и кнадец. Потом перешел на использование /portable. Естественно опять минимум пар по умолчанию, только в этот раз почему то не подгружаются другие, а мне демо USDCAD очень желательно в пятом МТ иметь.
Сохраните настроенный профиль по дефолту Файл - Профили - Default
 
Silent:

...

Что за загадка?

upd преобразовывать через строку и типы менять пробовал, не получается.

int current_period_tf;
ENUM_TIMEFRAMES current_period_tf;
 
tol64:

Тогда а) почему для объекта работает б) если заменить, начинают сыпаться

'0x00000008' - can't convert enum

причем не все, только 18 из 21 строки...

попробую все переписать, всё равно не понятно. Тип то один вроде.

 
Silent:

Тогда а) почему для объекта работает б) если заменить, начинают сыпаться

причем не все, только 18 из 21 строки...

попробую все переписать, всё равно не понятно. Тип то один вроде.

ENUM_TIMEFRAMES current_period_tf=PERIOD_CURRENT;
   string n="";
   if(_Period==PERIOD_M1)  {current_period_tf=PERIOD_M1;};
   if(_Period==PERIOD_M2)  {current_period_tf=PERIOD_M2;};
   if(_Period==PERIOD_M3)  {current_period_tf=PERIOD_M3;};
   if(_Period==PERIOD_M4)  {current_period_tf=PERIOD_M4;};
   if(_Period==PERIOD_M5)  {current_period_tf=PERIOD_M5;};
   if(_Period==PERIOD_M6)  {current_period_tf=PERIOD_M6;};
   if(_Period==PERIOD_M10) {current_period_tf=PERIOD_M10;};
   if(_Period==PERIOD_M12) {current_period_tf=PERIOD_M12;};
   if(_Period==PERIOD_M15) {current_period_tf=PERIOD_M15;};
   if(_Period==PERIOD_M20) {current_period_tf=PERIOD_M20;};
   if(_Period==PERIOD_M30) {current_period_tf=PERIOD_M30;};
   if(_Period==PERIOD_H1)  {current_period_tf=PERIOD_H1;};
   if(_Period==PERIOD_H2)  {current_period_tf=PERIOD_H2;};
   if(_Period==PERIOD_H3)  {current_period_tf=PERIOD_H3;};
   if(_Period==PERIOD_H4)  {current_period_tf=PERIOD_H4;};
   if(_Period==PERIOD_H6)  {current_period_tf=PERIOD_H6;};
   if(_Period==PERIOD_H8)  {current_period_tf=PERIOD_H8;};
   if(_Period==PERIOD_H12) {current_period_tf=PERIOD_H12;};
   if(_Period==PERIOD_D1)  {current_period_tf=PERIOD_D1;};
   if(_Period==PERIOD_W1)  {current_period_tf=PERIOD_D1;};
   if(_Period==PERIOD_MN1) {current_period_tf=PERIOD_MN1;};
   ChartSetSymbolPeriod(ChartID(),_Symbol,PERIOD_M1);
   ObjectSetInteger(0,n,OBJPROP_TIMEFRAMES,current_period_tf);
   ChartSetSymbolPeriod(ChartID(),_Symbol,current_period_tf);