Выпущена бета-версия MetaTrader 4 Build 582 с обновленным языком MQL4 и Маркетом приложений - страница 17

 
pro_:
другая структура записей в файл или нет не знаю, но мой индикатор (переделанный из этого https://www.mql5.com/ru/code/10120) работать перестал!
Компилируется, файл вроде открывает, и все... прочесть не может. Сейчас разбираюсь.
Строка в заголовке ANSI. Читаете её, как UNICODE. Отсюда проблемы.
 

Метаквоты, всё же, есть проблемы с главным окном терминала, начиная, примерно, с 480 билда.

Ранее писал уже. Кажется, Слава отвечал примером кода, который работал. Но пример был из MQL4-скрипта.

Окно не выполняет команды по восстановлению, разворачиванию, активации, если эти команды посылает другое приложение из окна со стилем "всегда поверх других окон".

Экспериментировал из консоли с таким стилем.

Особенно странно, что окно разворачивается, но находится под всеми остальными окнами. Должно же развернуться там, где было в Z-порядке.

Но, если перед началом активировать MDI-клиента, то всё работает правильно.

======================

Хорошо, хоть, со стилем "без заголовка" разобрался. Мой косяк. Перерисовывал окно путём клика мыши на графике. Чтобы с другими сообщениями не возиться. Больно сложно.

Сделал ограничение в 2 открытых окна графика. Если меньше, чем 2 окна, то игнорируем операцию. В 509 было 2 окна открыто (работало), в 574 одно окно открыто (не работало) :-))

 
1) Сохранил файл в формате Unicode. Не помогло.

2) Файл ANSI. Изменил это:
   handle=FileOpen(FileName,FILE_CSV|FILE_READ,",");
на это:
   handle=FileOpen(FileName,FILE_CSV|FILE_READ|FILE_ANSI,",");

не помогло.

Посоветуйте как исправить.

P.S. Открыть файл к которому обращается индикатор и в блокноте и в Екселе становится невозможным не только после удаления индикатора, но даже после закрытия терминала. Только перезагрузка компьютера помогает.
 
pro_:
P.S. Открыть файл к которому обращается индикатор и в блокноте и в Екселе становится невозможным не только после удаления индикатора, но даже после закрытия терминала. Только перезагрузка компьютера помогает.


Закройте файл с помощью FileClose

Потом уже открывайте файл с помощью других программ

 
nen:


Закройте файл с помощью FileClose

Потом уже открывайте файл с помощью других программ


В индикаторе FileClose прописан, в том то и дело. При компиляции индикатора терминал падает (это у него в последнее время постоянно происходит), после этого файл открыт. Применять и удалять индикатор снова тоже не помогает.

 
pro_:

Посоветуйте как исправить.

1. При открытии используйте такую комбинацию флагов: FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_ANSI (зачем одновременно FILE_WRITE и FILE_SHARE_WRITE - не знаю)

2. В заголовке укажите новую версию и занулите записываемый массив:

   int      file_version=401;
   string   c_copyright;
   string   c_symbol=Symbol();
   int      i_digits=Digits;
   int      i_unused[13];
//---  
   c_copyright="(C)opyright 2003, MetaQuotes Software Corp.";
   ArrayInitialize(i_unused,0);
//--- write history file header
   FileWriteInteger(HstHandle,file_version,LONG_VALUE);
   FileWriteString(HstHandle,c_copyright,64);
   FileWriteString(HstHandle,c_symbol,12);
   FileWriteInteger(HstHandle,TimeFrame,LONG_VALUE);
   FileWriteInteger(HstHandle,i_digits,LONG_VALUE);
   FileWriteInteger(HstHandle,0,LONG_VALUE);
   FileWriteInteger(HstHandle,0,LONG_VALUE);
   FileWriteArray(HstHandle,i_unused,0,13);

3. Запись баровых данных переделайте на вызов вот такой функции:

void WriteToFile( int handle, datetime t, double o, double l, double h, double c, long v )
{
        MqlRates rate;
        
        rate.time = t;
        rate.open = o;
        rate.low  = l;
        rate.high = h;
        rate.close = c;
        rate.tick_volume = v;
   rate.spread = 0;
   rate.real_volume = 0;

        FileWriteStruct( handle, rate );
}

4. Все переменные, связанные с volume, сделайте типа long.

Только сегодня переписывал 2 таких советника, все работает.

Удачи!

 

Buil 574 а так же актуальный Build 574

При переключении периода графика происходит переинициализация глобальных переменных причем только в индикаторах.

В справке однозначно написанно что инициализация происходит однажды при запуске программы


Из лога видно, что эксперт выводит правильные измененные значения а индикатор производит инициализацию


Используется в эксперте и индикаторе этот простой код



Чем обосновывается такое поведение в индикаторе?

Ошибка или не документированная особенность?


Файлы:
igv.mq4  2 kb
eagv.mq4  2 kb
 

было бы еще удобно показ уровней на горячую клавишу положить


 
komposter:

1. При открытии используйте такую комбинацию флагов: FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_ANSI (зачем одновременно FILE_WRITE и FILE_SHARE_WRITE - не знаю)

2. В заголовке укажите новую версию и занулите записываемый массив:

3. Запись баровых данных переделайте на вызов вот такой функции:

4. Все переменные, связанные с volume, сделайте типа long.

Только сегодня переписывал 2 таких советника, все работает.

Удачи!

И от меня спасибо. До функции я уже дошёл, а до проверки формата ещё нет. Кстати, функция вроде и так работает

void WriteToFile( int handle, MqlRates& rate)      
 
wlad:

Чем обосновывается такое поведение в индикаторе?

Ошибка или не документированная особенность?



Да. Это - ошибка. Исправили. Спасибо за замечание