Вопрос по mql5 (запись в файл/чтение из файла)

 

Добрый день.
Господа, вопрос, если кто конечно поможет.

 Решил разобраться в mql5 функциями записи в файл и чтения из файла.

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

 Но на самом деле так не получается. Т.е. если файл открыт на запись в одной программе (индикаторе) (с указанием вышеописанных флагов), то он не откроется в другой программе (индикаторе) до тех пор пока в первой этот самый файл не будет закрыт (выдаёт ошибку 5004). 

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

Заранее спасибо. 

 
iCheh:

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


Во второй программе открывайте файл без флагов FILE_SHARE_WRITE и FILE_WRITE
 
Scriptong:
Во второй программе открывайте файл без флагов FILE_SHARE_WRITE и FILE_WRITE

Спасибо за ответ, но видимо я не совсем точно описал.

 

Первая программа открывает файл с флагами FILE_SHARE_READ и FILE_SHARE_WRITE. Вторая программа открывает файл с флагом FILE_SHARE_READ. Я понимаю, что если одна программа открыла файл для чтения/записи, то вторая может открыть этот файл только для чтния.

Но тем не менее ошибка. Файл не может быть окрытым двумя разными программами одновременно (по крайней мере у меня пока не получается).  

 
iCheh:

Спасибо за ответ, но видимо я не совсем точно описал.

 

Первая программа открывает файл с флагами FILE_SHARE_READ и FILE_SHARE_WRITE. Вторая программа открывает файл с флагом FILE_SHARE_READ. Я понимаю, что если одна программа открыла файл для чтения/записи, то вторая может открыть этот файл только для чтния.

Но тем не менее ошибка. Файл не может быть окрытым двумя разными программами одновременно (по крайней мере у меня пока не получается).  

Вы все правильно описали первый раз. Это я первый раз ответил неправильно. Хотел написать "с флагами FILE_SHARE_WRITE | FILE_SHARE_READ" , а написал черти что.

Совместный доступ к файлу получается следующим образом:

"Пишушая" программа:

#define FILE_NAME   "TestFile.bin"
int g_handle = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   g_handle = FileOpen(FILE_NAME, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_WRITE | FILE_READ | FILE_BIN);
   if (g_handle < 0)
      return INIT_FAILED;
      
   FileWriteDouble(g_handle, 345346.14349876);
   FileFlush(g_handle);

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

   FileClose(g_handle);
}

 "Читающая" программа:

#define FILE_NAME   "TestFile.bin"
int g_handle = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   g_handle = FileOpen(FILE_NAME, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_READ | FILE_BIN);
   if (g_handle < 0)
   {
      Alert("Ошибка открытия файла ", GetLastError());
      return INIT_FAILED;
   }
      
   double value = FileReadDouble(g_handle);
   FileClose(g_handle);

   Alert("Прочитано число: ", DoubleToString(value));
   return(INIT_SUCCEEDED);
}

 Порядок действий:

1. К одному графику подключается "пишущая" программа.

2. К другому графику подключается "читающая" программа.

Результат:

 

 
Спасибо еще раз. Всё получилось.
 
iCheh:
Спасибо еще раз. Всё получилось.
Пожалуйста. Обращайтесь ))
 
Ihor Herasko:
Пожалуйста. Обращайтесь ))

а как сделать что в файл писались тиковые котировки например по GBPUSD ?

Как из тиковых котировок получаем минутные графики с хаем/лоу/открытием и закрытием/volume? 

 
Pavel Vakushin:

...

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

Заранее спасибо. 

По очереди. Сначала одна открыла, записала, закрыла. Потом другая открыла, прочитала, закрыла.

А как вы представляете одновременно писать и читать? Прежде чем читать, надо полностью записать.

 
Pavel Vakushin:

Добрый день.
Господа, вопрос, если кто конечно поможет.

 Решил разобраться в mql5 функциями записи в файл и чтения из файла.

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

 Но на самом деле так не получается. Т.е. если файл открыт на запись в одной программе (индикаторе) (с указанием вышеописанных флагов), то он не откроется в другой программе (индикаторе) до тех пор пока в первой этот самый файл не будет закрыт (выдаёт ошибку 5004). 

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

Заранее спасибо. 

рецепт прост и горек :-)

флаги FILE_SHARE_READ FILE_SHARE_WRITE лучше не использовать и на них не полагаться. То есть можно, но надо сильно-сильно упереться :-)  Всё равно находится нечто использующее inclusive lock - тот же OO нагло блокирует доступ к открытому им файлу

лечение: Если индиктор не может сбросить данные в оговоренный файл, то он должен осуществить сброс в *.tmp (то есть писать во временный файл) и как подвернётся возможность переписать основной.

 
Sergey Shcherbakov:

а как сделать что в файл писались тиковые котировки например по GBPUSD ?

При помощи файловых операций. Один из подходов, как я понимаю, Вы уже видели в моем сборщике тиков. Но этот подход не является каким-либо стандартом. Так было удобно сделать мне. Другой программист, наверное, сделает несколько иначе.

 

Как из тиковых котировок получаем минутные графики с хаем/лоу/открытием и закрытием/volume? 

Это уже обработка тиков: берем очередной тик и сравниваем его время со временем открытия текущего бара, который мы сами синтезировали. Если время тика отличается от времени открытия бара на большее количество секунд, чем принятый нами период графика, то "закрываем" текущий бар и начинаем новый бар. То есть время взятого тика будет являться временем открытия бара, а котировка тика - ценой открытия бара. Все это тоже есть в индикаторе, который Вы посмотрели.