Скачать MetaTrader 5

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

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

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

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

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

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

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

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

Ihor Herasko
13855
Ihor Herasko  
iCheh:

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


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

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

 

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

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

Ihor Herasko
13855
Ihor Herasko  
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. К другому графику подключается "читающая" программа.

Результат:

 

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

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

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

Dmitry Fedoseev
46936
Dmitry Fedoseev  
Pavel Vakushin:

...

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

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

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

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

Maxim Kuznetsov
12229
Maxim Kuznetsov  
Pavel Vakushin:

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

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

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

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

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

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

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

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

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

Ihor Herasko
13855
Ihor Herasko  
Sergey Shcherbakov:

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

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

 

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

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