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

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:

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

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

Karputov Vladimir:

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

На локальных компах - так оно и есть. Везде грузится. Такой гемор только на выделенном виртуальном сервере под виндовс-сервер по моему 2007 года.

Alexey Navoykov:

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

Фактически вы предлагаете простую и понятную запись

a = (b + c) - d*e + f;
заменить на
*a = (*b + *c) - *d**e + *f;
И это ради чего? Ради того чтобы Вы могли записать
bool c = *a == *b;

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

Только создав математический базовый и производный класс, переопределив несколько (а не одну-две) арифметических операций, сделав их виртуальными и затем протестировав сложные выражения (а не только a = b + c) на их основе - только это приблизит Вас к пониманию того, что сейчас всё сделано ОПТИМАЛЬНО. А пока Вы рассуждаете на начальном уровне.

Если вынести сравнение указателей на равенство в отдельную функцию, то останется только одно(!) узкое место

class A {};

A *a = b; //однозначно присвоение указателю значения
a = b;    //неоднозначно
которое тем не менее также должно трактоваться как присвоение, а не вызов operator=(), поскольку в настоящее время для присвоения указателю значения не существует другого синтаксиса, в то время как a.operator=( b ) можно вызвать и явно