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

 
Nikolai Semko #:
Print(pow(0,0))

Ещё и

double x = 0.0;
Print(pow(1.0 / x, x)); // 1.0

Это даже как-то обосновывается.

 

Может проблема в МТ5?

Позиция ПОКУПКА была закрыта по цене покупки, которой нет на графике.



https://www.mql5.com/en/forum/449559

 

Я пару раз писал про баги, а оказывалось, что сам виноват. Теперь опасаюсь так писать.

Объясните мне кто знает.

Почему, при попытке установить базовую валюту и валюту прибыли функцией CustomSymbolSetString устанавливается вообще что попало?

Причём не важно, создаётся символ с пустыми свойствами или скопированными с символа источника.

//+------------------------------------------------------------------+
void OnStart()
  {
   string c_Name = "Renko " + _Symbol;
   CustomSymbol(c_Name);
   CustomSymbol(c_Name, _Symbol);
  }
//+------------------------------------------------------------------+
void CustomSymbol(string c_Name, string symbol = NULL)
  {

   CustomSymbolCreate(c_Name, "\\" + c_Name, symbol);

   if(symbol == NULL)
      symbol = _Symbol;

   Print("-----");
   Print("CustomBASE ", SymbolInfoString(c_Name, SYMBOL_CURRENCY_BASE));
   Print("CustomPROFIT ", SymbolInfoString(c_Name, SYMBOL_CURRENCY_PROFIT));

   CustomSymbolSetString(c_Name, SYMBOL_CURRENCY_BASE, SymbolInfoString(symbol, SYMBOL_CURRENCY_BASE));
   CustomSymbolSetString(c_Name, SYMBOL_CURRENCY_PROFIT, SymbolInfoString(symbol, SYMBOL_CURRENCY_PROFIT));

   Print("BASE ", SymbolInfoString(symbol, SYMBOL_CURRENCY_BASE));
   Print("PROFIT ", SymbolInfoString(symbol, SYMBOL_CURRENCY_PROFIT));
   Print("CustomBASE ", SymbolInfoString(c_Name, SYMBOL_CURRENCY_BASE));
   Print("CustomPROFIT ", SymbolInfoString(c_Name, SYMBOL_CURRENCY_PROFIT));

   CustomSymbolDelete(c_Name);
  }
//+------------------------------------------------------------------+
(EURUSD,M1)     CustomBASE USD
(EURUSD,M1)     CustomPROFIT USD
(EURUSD,M1)     BASE EUR
(EURUSD,M1)     PROFIT USD
(EURUSD,M1)     CustomBASE Ren
(EURUSD,M1)     CustomPROFIT ko
(EURUSD,M1)     -----
(EURUSD,M1)     CustomBASE EUR
(EURUSD,M1)     CustomPROFIT USD
(EURUSD,M1)     BASE EUR
(EURUSD,M1)     PROFIT USD
(EURUSD,M1)     CustomBASE Ren
(EURUSD,M1)     CustomPROFIT ko

Terminal        MetaTrader 5 x64 build 3815 started for MetaQuotes Software Corp.
Terminal        Windows 10 build 19044, 24 x Intel Xeon  E5-2678 v3 @ 2.50GHz, AVX, 21 / 29 Gb memory, 128 / 237 Gb disk, UAC, GMT+7
Network '5007313942': authorized on MetaQuotes-Demo through Access Point EU 1 (ping: 377.93 ms, build 3815)
Network '5007313942': previous successful authorization performed from 146.158.110.131 on 2023.06.27 18:01:18
Network '5007313942': terminal synchronized with MetaQuotes Software Corp.: 0 positions, 0 orders, 140 symbols, 0 spreads
Network '5007313942': trading has been enabled - hedging mode

 Проблема ещё в том, что даже если оставить базовую валюту и валюту прибыли скопированные с символа источника, то при любом изменении спецификации

хоть смене сессий CustomSymbolSetSessionQuote(), хоть любом другом изменении,  базовая валюта и валюта прибыли, становятся не правильными.

В чём причина?


Попробовал в другом терминале. Ошибка повторяется, но уже частично.

(RTS-9.23,M1)   CustomBASE USD
(RTS-9.23,M1)   CustomPROFIT USD
(RTS-9.23,M1)   BASE RUR
(RTS-9.23,M1)   PROFIT RUR
(RTS-9.23,M1)   CustomBASE Ren
(RTS-9.23,M1)   CustomPROFIT ko 
(RTS-9.23,M1)   -----
(RTS-9.23,M1)   CustomBASE RUR
(RTS-9.23,M1)   CustomPROFIT RUR
(RTS-9.23,M1)   BASE RUR
(RTS-9.23,M1)   PROFIT RUR
(RTS-9.23,M1)   CustomBASE RUR
(RTS-9.23,M1)   CustomPROFIT RUR

Terminal	MetaTrader 5 x64 build 3802 started for MetaQuotes Software Corp.
Terminal	Windows 10 build 19044, 24 x Intel Xeon  E5-2678 v3 @ 2.50GHz, AVX, 21 / 29 Gb memory, 128 / 237 Gb disk, UAC, GMT+7
Network	'84954': authorized on Open-Broker through Access Server VIII (ping: 42.83 ms, build 3661)
Network	'84954': previous successful authorization performed from 146.158.110.131 on 2023.06.27 20:10:56
Network	'84954': terminal synchronized with АО ''Открытие Брокер'': 0 positions, 0 orders, 5641 symbols, 43 spreads
Network	'84954': trading has been enabled - netting mode
 
Добрый день, с чем может быть связано исчезновение результатов оптимизации в тестере терминалов.  Сохраняется последняя оптимизация, все предыдущие автоматически удаляются. 
 

Добрый день.

В последних версиях терминала появился такой деффект:

Как я понимаю функция SocketSend работает асинхронно. Какой бы большой буффер данных не передавался ей на вход, она сразу возвращает управление, а реальная передача данных происходит фоном для эксперта.

Если в этот момент позвать функцию SocketIsConnected то она возвращает false, при этом в _LastError 0.


Это новое (и на мой взгляд неверное) поведение поломало имеющийся код. Для себя проблему решил отправкой данных маленькими кусками, но хотелось бы услышать мнение кого-то из команды разработчиков.


Спасибо.

Документация по MQL5: Сетевые функции / SocketSend
Документация по MQL5: Сетевые функции / SocketSend
  • www.mql5.com
SocketSend - Сетевые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ошибка при компиляции, а в другом случае нормально:
class A {
    static int i;
};
A *a1 = new A; //(1) нормально
A  a2;         //(2) Error: unresolved static variable 'A::i'
А какая принципиальная разница между (1) и (2) ?
 
A100 #:
Ошибка при компиляции, а в другом случае нормально: А какая принципиальная разница между (1) и (2) ?

Если объявляете статическую переменную, то следует ее и определить.

class A {
    static int i;
};
int A::i = 0;
A *a1 = new A; // OK
A  a2;         // OK

Попробуйте добавить в класс метод обращающийся к переменной и уже получите ошибку компиляции в коде класса

class A {
    static int i;
    
    void print() { Print(i); } // Error: unresolved static variable 'A::i'
};


А принципиальная разница между вашими случаями (1) и (2) следующая (очень грубо):

Во втором случае вы объявляете глобальную переменную-экземпляр класса. Компилятору необходимо выделить память для нее и всего связанного с классом и здесь же компилятор пытается понять куда указывает имя `A::i`.

А в первом случае вы объявляете глобальную переменную-указатель на экземпляр класса. Здесь компилятору надо выделить память только для указателя, а сам объект будет создан уже в процессе выполнения программы.

 
Ramil.Bagizov #:

Если объявляете статическую переменную, то следует ее и определить.

Определил ниже, почему ошибка не исчезла?

class A {
    static int i;
} *a1 = new A, //(1) нормально
   a2;         //(2) Error: unresolved static variable 'A::i'
int A::i;      //(3)
И в чем тогда уже принципиальная разница между:
class A {
    static int i;
} *a1 = new A; //(1) нормально
int A::i;      //(3)
и
class A {
    static int i;
} a2;         //(2) Error: unresolved static variable 'A::i'
int A::i;     //(3)
???
 
A100 #:

Определил ниже, почему ошибка не исчезла?

До того как Вы определили A::i компилятору нужно создать глобальный экземпляр класса и ему нужно знать куда ссылается A::i. Мне кажется такой ситуации не возникло бы, если бы MQL5 код сначала компилировался в объектные файлы, а потом компоновался в исполняемый (на пример как в С/С++).

А на вопрос про принципиальную разницу я ответил в предыдущем сообщении. Здесь ровно та же самая ситуация в певом случае имеем только указатель на экземпляр (объект) класса, во втором сам экземпляр.

 
Ramil.Bagizov #:

А на вопрос про принципиальную разницу я ответил в предыдущем сообщении. Здесь ровно та же самая ситуация в певом случае имеем только указатель на экземпляр (объект) класса, во втором сам экземпляр.

Возвращаюсь к первоначальному примеру:

class A {
    static int i;
};
A* a1 = new A; //(1) нормально
A  a2;         //(2) Error: unresolved static variable 'A::i'
void OnStart() {}

Почему С\С++ создает исполняемый файл без ошибок, а в MQL ошибка уже на этапе компиляции?

Вы объяснили, почему в MQL возникает ошибка - компилятору чего то там не хватает, а почему в C\C++ всего хватает?