Код ошибки 5004 - страница 3

 
RaptorUK:

Не было прикрепленного файла...

Вы подтвердили, что файл, из которого вы пытаетесь считать, действительно существует? Пожалуйста, загляните в нужную папку и проверьте... И еще одно, почему у вас есть функция filewriting() для READ из файла?


Уважаемый RaptorUK,

Да, я могу подтвердить, что файл DAT находится в папке MQL4/files. На самом деле, я сообщил, что я поставил условие, удастся ли открыть файл, и это удается в большинстве случаев (90%), а 10% не удается открыть и выдает код ошибки 5004.

Функция filewriting() вызывается при неудачном открытии файла. Затем функция filewriting пытается создать файл (открыть для записи) и в конце функции выполняет закрытие файла.

Я приложил файл из оператора Print() из папки MQL4\logs. Я нажал на кнопку "Choose File" и увидел, что имя файла отображается.

С теплыми пожеланиями,

Raisingfire

Файлы:
 
raisingfire:


Уважаемый RaptorUK,

Да, я могу подтвердить, что файл DAT находится в папке MQL4/files. Фактически, я сообщил, что поставил условие, удастся ли открыть файл, и это удается в большинстве случаев (90%), а 10% не удается открыть и выдает код ошибки 5004.

Функция filewriting() вызывается при неудачном открытии файла. Затем функция filewriting пытается создать файл (открыть для записи) и в конце функции выполняет закрытие файла.

Я приложил файл из оператора Print() из папки MQL4\logs. Я нажал на кнопку "Choose File" и увидел, что имя файла отображается.

С теплыми пожеланиями,

Raisingfire

Откуда берутся эти файлы? Что их записывает?
 
RaptorUK:
Откуда берутся эти файлы? Что их пишет?

Уважаемый RaptorUK,

Все файлы DAT предназначены для временного хранения начальных значений определенных индикаторов каждый раз, когда мы открываем позицию. Мы создали и использовали их в наших программах.

Для открытия файла для записи мы используем стандартную функцию:

fhandle=FileOpen(mf, FILE_BIN|FILE_WRITE);

Стандартная запись массива в временные файлы (DAT) :

FileWriteArray(fhandle, mpara, 0, maxori); // где mpara - массив, Maxori - максимальный размер массива.

Стандартная функция закрытия файла:

FileClose(fhandle);

Спасибо за помощь.


С уважением,

Raisingfire

 
raisingfire:

Уважаемый RaptorUK,

Все файлы DAT предназначены для временного хранения начальных значений определенных индикаторов каждый раз, когда мы открываем позицию. Мы создали и использовали их в наших программах.

Для открытия файла для записи мы используем стандартную функцию:

fhandle=FileOpen(mf, FILE_BIN|FILE_WRITE);

Стандартная запись массива в временные файлы (DAT) :

FileWriteArray(fhandle, mpara, 0, maxori); // где mpara - массив, Maxori - максимальный размер массива.

Стандартная функция закрытия файла:

FileClose(fhandle);


Хорошо, но вы не ответили на мой вопрос... они написаны тем же экспертом, который пытается их прочитать? или другим экспертом, скриптом или индикатором?
 
RaptorUK:

Хорошо, но вы не ответили на мой вопрос... они написаны тем же экспертом, который пытается их прочитать? или другим экспертом, скриптом или индикатором?


Функция записи файлов находится в одном и том же советнике. Каждый раз, когда мы выпускаем "FILEOPEN", мы всегда следуем за ним "FILECLOSE" после того, как мы выполняем определенную задачу с ним. Так что, я не думаю, что есть проблема с заблокированным файлом, который пытаются открыть.

Давным-давно у нас была подобная проблема, когда заблокированный файл пытались прочитать. И MT4 автоматически сообщал об этом в своем лог-файле. Таким образом, через 1-2 дня папки Logs и history становились огромными по размеру (сотни мегабайт), заполненными этими отчетами. Тогда мы выдавали FILECLOSE каждый раз, когда делали FILEOPEN. Проблема была решена, и папки журналов и истории больше не становились огромными. Теперь папки журналов и истории вместе взятые содержат только менее 100 Кбайт (несмотря на код ошибки 5004, который постоянно выскакивает).


Спасибо,

Raisingfire

 
raisingfire:

Функция записи файлов находится все в том же советнике. Каждый раз, когда мы выпускаем "FILEOPEN", мы всегда следуем за ним "FILECLOSE" после выполнения определенной задачи с ним. Так что, я не думаю, что есть проблема с заблокированным файлом, который пытаются открыть.

Давным-давно у нас была подобная проблема, когда заблокированный файл пытались прочитать. И MT4 автоматически сообщал об этом в своем лог-файле. Таким образом, через 1-2 дня папки Logs и history становились огромными по размеру (сотни мегабайт), заполненными этими отчетами. Тогда мы выдавали FILECLOSE каждый раз, когда делали FILEOPEN. Проблема была решена, и папки журналов и истории больше не становились огромными. Теперь папки журналов и истории вместе взятые содержат всего менее 100 Кбайт (несмотря на постоянно появляющийся код ошибки 5004).

Хорошо, спасибо за информацию. У меня нет идей ... все, что я могу предложить сейчас, это создать тестовый советник, воспроизводящий проблему, который вы можете опубликовать здесь и отправить в MetaQuotes как часть тикета Service Desk и попросить их провести расследование.
 
RaptorUK:
Хорошо, спасибо за информацию. У меня нет идей ... все, что я могу предложить сейчас, это создать тестовый советник, воспроизводящий проблему, который вы можете опубликовать здесь и отправить в MetaQuotes как часть тикета Service Desk и попросить их провести расследование.


Уважаемый RaptorUK,


Спасибо за всю вашу помощь и информацию в любом случае. Я постараюсь сделать то, что вы мне сказали.

Еще раз спасибо.


С уважением,

 
//+------------------------------------------------------------------+
//| expert count strategy open position function  (closedPos)          |
//+------------------------------------------------------------------+
void closedPos() {  

   int file=FileOpen("hist0935.csv",FILE_WRITE|FILE_CSV);
   
  
      
for(int i=OrdersHistoryTotal()-1; i>=0; i--) {

int file=FileOpen("hist0935.csv",FILE_READ|FILE_WRITE|FILE_CSV);

ResetLastError();
file=FileOpen("hist0935.csv",FILE_READ|FILE_WRITE|FILE_CSV);


      OrderSelect(i, SELECT_BY_POS, MODE_HISTORY); 

  if (file != INVALID_HANDLE){    

   PrintFormat("%s file is available for writing",file);
  
  
     
      FileWrite(file,OrderTicket(),OrderClosePrice(),OrderCloseTime());
      
      //--- close the file
     Print("error="+GetLastError());
      FileClose(file);
      PrintFormat("%s file is closed",file);
       
  }else{
      Alert("hist0935 Events File Error.",GetLastError());
   }
  
   }        
 // return();
}
 
raisingfire:

Уважаемый RaptorUK,


Спасибо за всю вашу помощь и информацию в любом случае. Я попробую сделать то, что вы мне сказали.

Еще раз спасибо.


С уважением,



Самое:

Есть ли решение для ошибки 5004? Я получаю такое же сообщение об ошибке при попытке записи в файл.

//+------------------------------------------------------------------+
//| expert count strategy open position function  (openPos)          |
//+------------------------------------------------------------------+
void closedPos() {  

   int file=FileOpen("hist0935.csv",FILE_WRITE|FILE_CSV);
   
  
      
for(int i=OrdersHistoryTotal()-1; i>=0; i--) {

int file=FileOpen("hist0935.csv",FILE_READ|FILE_WRITE|FILE_CSV);

ResetLastError();
file=FileOpen("hist0935.csv",FILE_READ|FILE_WRITE|FILE_CSV);


      OrderSelect(i, SELECT_BY_POS, MODE_HISTORY); 
//Print("OrderClosePrice()= " +OrderClosePrice()+"OrderCloseTime()= " + OrderCloseTime()+"OrderComment()= " + OrderComment()+ "OrderCommission()= " +OrderCommission()+ "OrderExpiration()= " +OrderExpiration()+ "OrderLots()= " +OrderLots()+ "OrderMagicNumber()= " +OrderMagicNumber()+ "OrderOpenPrice()= " +OrderOpenPrice()+ "OrderOpenTime()= " +OrderOpenTime()+ "OrderProfit()= " +OrderProfit()+ "OrderStopLoss()= " +OrderStopLoss()+ "OrderSwap()= " +OrderSwap()+ "OrderSymbol()= " +OrderSymbol()+ "OrderTakeProfit()= " +OrderTakeProfit()+ "OrderTicket()= " +OrderTicket()+ "OrderType()= " +OrderType() ); 
 

  if (file != INVALID_HANDLE){    

   PrintFormat("%s file is available for writing",file);
  
   
      //FileWrite(file,OrderClosePrice(),OrderCloseTime(), OrderComment(),OrderCommission(),OrderExpiration(),OrderLots(),OrderMagicNumber(),OrderOpenPrice(),OrderOpenTime(),OrderProfit(),OrderStopLoss(),OrderSwap(),OrderSymbol(),OrderTakeProfit(),OrderTicket(),OrderType());
     
      FileWrite(file,OrderTicket(),OrderClosePrice(),OrderCloseTime());
      
      //--- close the file
     Print("error="+GetLastError());
      FileClose(file);
      PrintFormat("%s file is closed",file);
       
  }else{
      Alert("hist0935 Events File Error.",GetLastError());
   }
  
   }        
 // return();
}

Я нахожусь на сборке 765.

Ваша помощь будет очень признательна.

 
   int file=FileOpen("hist0935.csv",FILE_WRITE|FILE_CSV);  
      
for(int i=OrdersHistoryTotal()-1; i>=0; i--) {

int file=FileOpen("hist0935.csv",FILE_READ|FILE_WRITE|FILE_CSV);
                                                                
ResetLastError();                                               
file=FileOpen("hist0935.csv",FILE_READ|FILE_WRITE|FILE_CSV);    

  1. Вы открываете файл для записи, теперь он имеет нулевую длину.
  2. Начальный цикл
  3. Вы открываете файл для чтения и записи. Теперь файл открыт дважды и потерян первоначальный хэндл.
  4. ResetLastError не нужен, смотрите только на GetLastError, когда у вас есть проблема.
  5. Вы открыли файл трижды и потеряли два хэндла.
  6. В следующем цикле вы открываете файл еще раз.
Причина обращения: