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

 
A100:
Вот что я предложил:
...
Изменения затрагивают только операции == и !=
Всё остальное, включая операцию = оставить как есть сейчас (без изменений)

Как можно оператор= оставить без изменений, если это сейчас вызывает путаницу между указателями и самими объектами?  Если же использовать для этого *, то её следует использовать её и для всех остальных операторов. Должен быть единый стандарт.  А то что вы предлагаете, чтобы компилятор сам выбирал нужный вариант - это неправильно.  Будет куча трудноуловимых ошибок.  Всё должно быть однозначно:  действия либо с объектом, либо с указателем.

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

Нужно было отойти от привязки к С++, и соответственно отказаться от указателей как самостоятельного типа переменной, заменив их ссылками. Ссылки - по сути те же указатели, только интерпретируются компилятором как непосредственно сами объекты. Поэтому все действия с такими переменными, включая и операторы, трактуются как действия с объектом.  Если же понадобится сравнить или присвоить именно ссылки, то использовать оператор взятия ссылки.  Поэтому никаких противоречий не будет.   Вот примерно так:

 A  a;                     // воздаём объект
 A& aref;                  // создаём неинициализированную ссылку

 &aref = &a;                // присваиваем ссылку на a
 bool equalref = &aref==&a; // сравниваем ссылки

 aref = a;                  //вызываем оператор=()
 bool equal = aref==a;      // вызываем оператор==()

В общем, если когда-нибудь разработчики задумают MQL6, то нужно идти в этом направлении.  Привязка к С++ уже бессмысленна, ибо не соответствует концепции языка.

 
A100:
У Вас какое самое последнее обновление было из того что есть?

И MetaTrader и MetaEditor build 1159 (Windows 10 32 bit). На большом ПК (64 bit) на счёт MetaEditor'a не уверен, а MetaTrader точно build 1159.
 
A100:
У Вас какое самое последнее обновление было из того что есть?

у меня стоит 1150. не видит обновления до более поздней 1159
 
Gennadiy Stanilevych:
у меня стоит 1150. не видит обновления до более поздней 1159
Для получения последних обновлений нужно подключаться к серверу MetaQuotes-Demo.
 
A100:
Интерес представляет именно MetaQuotes-Demo потому как раньше обновления были 2-3 раза в месяц. Понятно что у брокеров обновления значительно реже.
Karputov Vladimir:
Для получения последних обновлений нужно подключаться к серверу MetaQuotes-Demo.

Согласен, обновился через MetaQuotes-Demo, все равно 1150! Причем терминал несколько раз сообщил, что скачаны обновления и предложил перезагрузиться, все равно 1150.

Ок, скачал дистрибутив с http://www.metatrader5.com/ru/download, завел демо-счет на MetaQuotes-Demo, несколько раз выключил-включил терминал - 1150! UAC отключен, Windows 7 SP1 - 64

Скачать MetaTrader 5
Скачать MetaTrader 5
  • www.metatrader5.com
Скачать торговый терминал MetaTrader 5 для комфортной и успешной работы на финансовых рынках. Терминал обладает внушительными торговыми и аналитическими возможностями и является одним из лучших в мире
 

Повторю вопрос, т.к. никто не ответил, а в связи с бурным обсуждением ООП он уехал вниз. Вопрос реально важный, это баг или фича? Замечено на МТ4.

Столкнулся с ситуацией, когда extern переменная меняется в ходе выполнения программы, но при смене таймфрейма опять принимает значение, заданное в окне свойств. Например, если перед запуском я установлю значение TradeEnable в EnableAll, а при выполнении программы поменяю значение на EnableBuy, то при перещелкивании чарта на другой таймфрейм значение вернется на EnableAll. Значение я определяю в событии таймера и вывожу через Comment, ошибки быть не может.

enum ETradeEnable {EnableAll, EnableBuy, EnableSell, DisableAll};
extern ETradeEnable TradeEnable = EnableAll;

Перещелкивание между чартами никак на переменную TradeEnable не влияет. Читаю хелп - В отличии input-переменных, значения extern-переменных могут быть программно изменены в процессе работы программы.

Вот так у меня устроены OnDeinit и OnInit.

Вопрос: я чего-то не понимаю или изменение TradeEnable это ошибка runtime?

int LastDeinitReason = 0;

void OnDeinit(const int reason)
{
    LastDeinitReason = reason;
    if(reason==REASON_CHARTCHANGE || reason==REASON_TEMPLATE || reason==REASON_PARAMETERS)
        return;
    EventKillTimer();
// далее код при завершении работы советника
}

int OnInit()
{
    if(LastDeinitReason==REASON_CHARTCHANGE || LastDeinitReason==REASON_TEMPLATE)
    {
        LastDeinitReason = 0;
        return(INIT_SUCCEEDED);
    }
    if(LastDeinitReason==REASON_PARAMETERS)
    {
        SetParams();
        return(INIT_SUCCEEDED);                              
    }
// далее код инициализации при запуске
}
 
Karputov Vladimir:
Для получения последних обновлений нужно подключаться к серверу MetaQuotes-Demo.
Это не помогает. Я даже сносил МТ5. Открывал демку на метаквотах. Все равно 1150. 
 
Gennadiy Stanilevych:
Это не помогает. Я даже сносил МТ5. Открывал демку на метаквотах. Все равно 1150. 
Просто открыть демо-счёт на сервере MetaQuites-Demo мало: для обновления нужно ещё и подключаться к этому демо-счёту.
 
Karputov Vladimir:
Просто открыть демо-счёт на сервере MetaQuites-Demo мало: для обновления нужно ещё и подключаться к этому демо-счёту.

Ну естественно подключился. Потом опять перегрузил терминал. Все равно не видит обновлений.

Файлы:
20150826.log  7 kb
 
Gennadiy Stanilevych:

Ну естественно подключился. Потом опять перегрузил терминал. Все равно не видит обновлений.

Странно (лог-файл просмотрел). По опыту - если есть обновления, то после подключения буквально в течении трёх секунд начинается закачка.

Причина обращения: