Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Делай скриншоты в MetaTrader и управляй ими в галерее!
ramnek
149
ramnek 2016.07.18 16:00 

Добрый вечер

Можете привести кусок кода с примером, чтобы он делал элементарную вещь:

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


не могу найти пример конкретно с дозаписью в конец файла 

спасибо 

LRA
318
LRA 2016.07.18 16:08  
ramnek: пример конкретно с дозаписью в конец файла 
  // Открытие или создание файла и перемещение указателя в конец
   int Файл = FileOpen(ИмяФайла, FILE_CSV | FILE_READ | FILE_WRITE, " ");
   FileSeek(Файл, 0, SEEK_END);

   // Если новый файл записать строку заголовков колонок
   if(FileSize(Файл)==0)FileWrite(Файл,
"  Дата     Время      Баланс    Средства      Залог    Свободно     Уровень      Прибыль");

   // Сбор информации и запись в файл
   string Текст=TimeToStr(TimeCurrent());                // Дата и Время
   string Строка=DoubleToStr(AccountBalance(),2);        // Баланс = Оприходованные средства
   while(StringLen(Строка)<12)Строка=" "+Строка;  Текст=Текст+Строка;
   Строка=DoubleToStr(AccountEquity(),2);         // Средства = Баланс + Прибыль
   while(StringLen(Строка)<12)Строка=" "+Строка;  Текст=Текст+Строка;
   Строка=DoubleToStr(AccountMargin(),2);         // Залог
   while(StringLen(Строка)<11)Строка=" "+Строка;  Текст=Текст+Строка;
   Строка=DoubleToStr(AccountEquity()-AccountMargin(),2); // Свободно= Средства - Залог
   while(StringLen(Строка)<12)Строка=" "+Строка;  Текст=Текст+Строка;
   Строка=DoubleToStr(AccountEquity()/AccountMargin()*100,2)+"%"; // Уровень=Средства/Залог
   while(StringLen(Строка)<12)Строка=" "+Строка;  Текст=Текст+Строка;
   Строка=DoubleToStr(AccountProfit(),2);         // Прибыль 
   while(StringLen(Строка)<13)Строка=" "+Строка;  Текст=Текст+Строка;

   FileWrite(Файл, Текст);   // Запись в файл сформированной текстовой строки
   FileClose(Файл);          // Закрыть файл
   Файл = 0;                 // Заметая следы обнулим указатель
}
Только Excel в отличие от текстового файла является книгой, с особой внутренней организацией. Нужно делать импорт текстового файла
ramnek
149
ramnek 2016.07.18 16:53  
LRA, спасибо большое
ramnek
149
ramnek 2016.07.19 09:48  

только не помогло.. 

FileSeek(Файл, 0, SEEK_END);

как будто ничего не делает.. файл при записи пишет с самого начала и затирает все, что было до

Mislaid
554
Mislaid 2016.07.19 10:53  
ramnek:

только не помогло.. 

FileSeek(Файл, 0, SEEK_END);

как будто ничего не делает.. файл при записи пишет с самого начала и затирает все, что было до

Откройте совместный доступ для чтения при создании файла. Файл лучше создать в OnInit(). Потом, не закрывая файл, пишите в него. Будет дописываться в конец.

В EXCEL настройте импорт файла и включите автообновление с интервалом в 1 минуту. Если нужно чаще, то можно вывести значок обновления на панель меню и кликать по нему мышкой. Я делаю и то, и другое.

  // Создание файла
   int Файл = FileOpen(ИмяФайла, FILE_CSV | FILE_SHARE_READ | FILE_WRITE, ";");
LRA
318
LRA 2016.07.19 14:29  
ramnek:   FileSeek(Файл, 0, SEEK_END); как будто ничего не делает.. файл при записи пишет с самого начала и затирает все, что было до

Понял, в чем дело. Обязательно нужна опция FILE_READ. Без нее файл создается заново и все бывшее ранее пропадает.

int Файл = FileOpen(ИмяФайла, FILE_CSV | FILE_READ | FILE_WRITE, " ");

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

Mislaid
554
Mislaid 2016.07.20 08:07  
LRA:

Понял, в чем дело. Обязательно нужна опция FILE_READ. Без нее файл создается заново и все бывшее ранее пропадает.

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


Вместо FILE_READ поставьте FILE_SHARE_READ и файл можно не закрывать. Другие будут спокойно его читать. Но, эти другие должны озаботиться обновлением. Вот они и должны закрывать и открывать файлы, чтобы увидеть обновления.

Иногда они будут нарываться на ошибки доступа к файлу. Но, по опыту, это происходит редко, если обновляться раз в несколько секунд. 

LRA
318
LRA 2016.07.20 10:12  
Mislaid:

Вместо FILE_READ поставьте FILE_SHARE_READ и файл можно не закрывать. Другие будут спокойно его читать. Но, эти другие должны озаботиться обновлением. Вот они и должны закрывать и открывать файлы, чтобы увидеть обновления.

Иногда они будут нарываться на ошибки доступа к файлу. Но, по опыту, это происходит редко, если обновляться раз в несколько секунд. 

Открытый файл невозможно прочесть Блокнотом Windows, Notepad++ и другими программами - или он кажется пустым, или в нем отсутствуют последние записи. Когда же файл открывается перед записью и закрывается сразу после - он спокойно читается всеми программами.
Alexey Viktorov
5174
Alexey Viktorov 2016.07.20 11:40  
LRA:
Открытый файл невозможно прочесть Блокнотом Windows, Notepad++ и другими программами - или он кажется пустым, или в нем отсутствуют последние записи. Когда же файл открывается перед записью и закрывается сразу после - он спокойно читается всеми программами.
Можно после обновления файла принудительно сбросить данные на диск, но это не выход из положения. Если файл не закрывать, то он не увидит изменения сделанные кем-то другим и тогда FILE_SHARE_READ не поможет.
Mislaid
554
Mislaid 2016.07.20 18:01  
LRA:
Открытый файл невозможно прочесть Блокнотом Windows, Notepad++ и другими программами - или он кажется пустым, или в нем отсутствуют последние записи. Когда же файл открывается перед записью и закрывается сразу после - он спокойно читается всеми программами.

Странно. У меня все читается.

Действительно, его невозможно открыть сторонними приложениями, если при открытии не указать  FILE_SHARE_READ

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий