Скачать MetaTrader 5

Как из советника читать файл на "C:\log.txt" ?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Устанавливай программы из библиотеки прямо в MetaTrader. Это просто!
Andrew Kornishkin
7012
Andrew Kornishkin 2015.09.04 12:35 

Подскажите пожалуйста простое решение?

Пробовал функции ReadFile.

//+------------------------------------------------------------------+
//|   прочитать файл и вернуть строку с содержимым                   |
//+------------------------------------------------------------------+
string ReadFile (string path) 
  {
    int handle=_lopen (path,OF_READ);           
    if(handle<0) 
      {
        Print("Ошибка открытия файла ",path); 
        return ("");
      }
    int result=_llseek (handle,0,0);      
    if(result<0) 
      {
        Print("Ошибка установки указателя" ); 
        return ("");
      }
    string buffer="";
    string char1="x";
    int count=0;
    result=_lread (handle,char1,1);
    while(result>0) 
      {
        buffer=buffer+char1;
        char1="x";
        count++;
        result=_lread (handle,char1,1);
     }
    result=_lclose (handle);              
    if(result<0)  
      Print("Ошибка закрытия файла ",path);
    return (buffer);
  }
 

 Функция хорошо бы подошла, но что в ней исправить чтобы работала?

 

//+------------------------------------------------------------------+
//|   прочитать файл и вернуть строку с содержимым                   |
//+------------------------------------------------------------------+
string ReadFile (string path) 
  {
    int handle=_lopen (path,OF_READ);
    int read_size = 50;           
    string char50="x                                                 ";

    if(handle<0) 
      {
        Print("Ошибка открытия файла ",path); 
        return ("");
      }
    int result=_llseek (handle,0,0);      
    if(result<0) 
      {
        Print("Ошибка установки указателя" ); 
        return ("");
      }
    string buffer="";
    int count=0;
    int last=0;
    
    result=_lread (handle,char50,read_size);
    while(result>0 && result == read_size) 
      {
        buffer=buffer + char50;
        count++;
        result=_lread (handle,char50,read_size);
        last = result;
     }
    Print("Последний прочитанный блок имеет размер в байтах:", last);
    char50 = StringSubstr(char50,0,last);
    buffer = buffer + char50;    
    result=_lclose (handle);              
    if(result<0)  
      Print("Ошибка закрытия файла ",path);
    return (buffer);
  }
 

Не работает.

 

Смотрел библиотеку: https://www.mql5.com/ru/code/8577
Громоздко, не разобрался. 

Mislaid
622
Mislaid 2015.09.05 02:48  
AM2:

Подскажите пожалуйста простое решение?

Запустить терминал с ключем portable, а файл поместить в папку ...\MetaTrader 4\MQL4\Files

И не нужны ни какие библиотеки. 

Andrew Kornishkin
7012
Andrew Kornishkin 2015.09.05 03:11  
Mislaid:

Запустить терминал с ключем portable, а файл поместить в папку ...\MetaTrader 4\MQL4\Files

И не нужны ни какие библиотеки. 

Мне это нужно для непрерывного обмена данными между самописным приложением и МТ4. Прога пишет в любую другую папку а в терминальную нет. Если быть точнее, секунд через 5-10 вылетает ошибка и запись прекращается.

Сейчас пробую такой вариант:

#define OF_EXIST  0x00004000 // Открывает файл затем закрывает это. Используйте это, чтобы тестироваться для существования файла.

#import "kernel32.dll"
   int OpenFile(string lpFileName,int lpReOpenBuff,int wStyle);
#import
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int h=0;
   h=OpenFile("C:\\log.txt",0,OF_EXIST);
   Print("Handle: ",h);
  }

 

Но выдает ошибку:      2015.09.05 06:56:19.558   Access violation read to 0x00000000 in 'kernel32.dll'


atztek
279
atztek 2015.09.05 05:15  
AM2:

Следующее решение точно сработает (сам давно этим пользуюсь), но необходимо потратить немного времени чтобы разобраться.
Погуглите "link shell extension". На этом форуме так же давались описания, поищите.
По большому счету создаете папку где угодно на диске (например в C:\XYZ), а затем - жесткий(е) линк(и) к ней из любой другой папки (например из папки 'Files' MT4). После этого любой файл помещенный в эту папку будет доступен как в оригинальной папке, так и в ее линках, как если бы это была оригинальная папка.
Koldun Zloy
228
Koldun Zloy 2015.09.05 06:22  
AM2:

Мне это нужно для непрерывного обмена данными между самописным приложением и МТ4. Прога пишет в любую другую папку а в терминальную нет. Если быть точнее, секунд через 5-10 вылетает ошибка и запись прекращается.

Сейчас пробую такой вариант:

 

Но выдает ошибку:      2015.09.05 06:56:19.558   Access violation read to 0x00000000 in 'kernel32.dll'


Второй аргумент функции OpenFile не может быть нулём.

Нужно делать так:

#define OF_EXIST   0x00004000
#define OFS_MAXPATHNAME 128

struct OFSTRUCT
{
  uchar cBytes;
  uchar fFixedDisk;
  ushort nErrCode;
  ushort Reserved1;
  ushort Reserved2;
  uchar szPathName[OFS_MAXPATHNAME];
};

#import "kernel32.dll"
   int OpenFile( string lpFileName, OFSTRUCT& lpReOpenBuff, int wStyle );
#import

void OnStart()
{
   int h = 0;
   OFSTRUCT ofstruct;
   h = OpenFile( "C:\\log.txt", ofstruct, OF_EXIST );
   Print( "Handle: ", h );
}
TarasBY
1739
TarasBY 2015.09.05 06:42  
AM2:

Подскажите пожалуйста простое решение?


Создайте символическую ссылку на log.txt в "песочнице" терминала и всё будет работать.
Andrew Kornishkin
7012
Andrew Kornishkin 2015.09.05 17:20  
Благодарен всем за помощь. Сейчас смотрю симлинки, также будет интересно и с win api продолжить.
LRA
336
LRA 2015.09.09 12:09  
TarasBY:
Создайте символическую ссылку на log.txt в "песочнице" терминала и всё будет работать.
Поясните, пожалуйста, как создать символическую ссылку на файл в "песочнице" терминала
LRA
336
LRA 2015.09.09 14:48  
Ko1dun:

Нужно делать так:

   int h = 0;
   OFSTRUCT ofstruct;
   h = OpenFile( "C:\\log.txt", ofstruct, OF_EXIST );
   Print( "Handle: ", h );
Print выдает -1, что ИМХО, является признаком ошибки...
TarasBY
1739
TarasBY 2015.09.09 16:26  
LRA:
Поясните, пожалуйста, как создать символическую ссылку на файл в "песочнице" терминала
Вы погуглили "link shell extension"? После инсталляции в контекстном меню проводника появятся новые пункты. Кликаете правой клавишей на C:\log.txt и выбираете "Запомнить источник ссылки". Затем на папке терминала (файловой "песочнице") - у инсталлированного терминала она в одном месте, у portable в другом - разберётесь сами, опять кликаете правой клавишей и выбираете "Поместить как" -> "Символическую ссылку". Ссылка создана, терминал будет обращаться к ссылке, как к файлу.
LRA
336
LRA 2015.09.09 19:43  
TarasBY:
Вы погуглили "link shell extension"? После инсталляции ...

Инсталлировать все подряд отучился еще 50 лет назад.

Для одного файла ссылка создается так:

mklink  "X:\ПапкаТерминала\MQL4\Files\A.txt" "Y:\Фильмы\A.txt"

и в папке ...MQL4\Files\ появился файл A.txt

Для папки команда с ключом /D:

mklink /D "X:\ПапкаТерминала\MQL4\Files\BIRD\" "Y:\ICO\"

и в папке ...MQL4\Files\ появилась папка BIRD, а в ней - все содержимое папки Y:\ICO\

Подробнее: http://tigors.net/windows-on-ssd-tweaks/  и  http://kaktusenok.blogspot.ru/2012/05/hardlink-windows-7.html
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий