错误代码5004 - 页 3

 
RaptorUK:

没有附加的文件 . . .

你是否确认你试图读取的文件确实存在? 请在正确的文件夹中查看并检查......还有一件事,为什么你有一个叫做filewriting() 的函数来从一个文件读取


亲爱的RaptorUK。

是的,我可以确认DAT文件是在MQL4/files文件夹中。事实上,我已经告知,我给文件打开是否成功设置了一个条件,大部分时间都成功了(90%),10%的时间无法打开,并产生5004错误代码。

当文件打开失败时,会调用filewriting()函数。然后,funcition filewriting将尝试创建一个文件(为写而打开),在函数结束时,做fileclose。

我从MQL4/logs文件夹的Print()语句中附上了文件。我点击了 "选择文件 "按钮,我可以看到文件名被显示出来。

温馨提示。

Raisingfire

附加的文件:
 
raisingfire:


亲爱的RaptorUK。

是的,我可以确认,DAT文件在MQL4/files文件夹中。事实上,我已经告知,我给文件打开是否成功设置了一个条件,大部分时间都能成功(90%),10%的时间无法打开,并产生5004错误代码。

当文件打开失败时,会调用filewriting()函数。然后,funcition filewriting将尝试创建一个文件(为写而打开),在函数结束时,做fileclose。

我从MQL4/logs文件夹的Print()语句中附上了文件。我点击了 "选择文件 "按钮,我可以看到文件名被显示出来。

温馨提示。

Raisingfire

这些文件来自哪里?
 
RaptorUK:
这些文件是从哪里来的? 什么写的?

亲爱的RaptorUK。

所有的DAT文件都是一个临时文件,用于在我们每次开仓时保存某些指标的初始值。我们创建并在我们的程序中使用它们。

我们使用标准函数来打开文件进行写入。

fhandle=FileOpen(mf,FILE_BIN|FILE_WRITE)。

标准数组写入临时文件(DAT)。

FileWriteArray(fhandle, mpara, 0, maxori); //其中mpara是数组,Maxori是数组的最大尺寸

标准的文件关闭函数。

FileClose(fhandle)。

谢谢你的帮助。


请注意。

兴起之火

 
raisingfire:

亲爱的RaptorUK。

所有的DAT文件都是一个临时文件,在我们每次开仓时保存某些指标的初始值。我们创建并在我们的程序中使用它们。

我们使用标准函数来打开文件进行写入。

fhandle=FileOpen(mf, FILE_BIN|FILE_WRITE)。

标准数组写入临时文件(DAT)。

FileWriteArray(fhandle, mpara, 0, maxori); //其中mpara是数组,Maxori是数组的最大尺寸

标准的文件关闭功能。

FileClose(fhandle)。


好吧,但你实际上没有回答我的问题 ......它们是由试图读取它们的同一个EA编写的吗? 还是一个不同的EA、脚本或指标?
 
RaptorUK:

好吧,但你实际上没有回答我的问题 ......它们是由试图读取它们的同一个EA编写的吗? 还是一个不同的EA、脚本或指标?


文件写入功能 都在同一个EA中。每次,我们发出 "FILEOPEN",我们总是在做完某些任务后用 "FILECLOSE "来跟随它。所以,我不认为试图打开的锁定文件有什么问题。

很久以前,我们遇到过这样的问题,一个被锁定的文件被试图读取。而MT4在其日志文件中自动报告。因此,1或2天后,日志和历史文件夹变得巨大(数百Mbytes),充满了这些报告。然后,我们每次做FILEOPEN时都会发出FILECLOSE。问题得到了解决,日志和历史文件夹再也没有变得巨大。现在,日志和历史文件夹加起来只包含不到100KB(尽管错误代码5004不断弹出)。


谢谢。

Raisingfire

 
raisingfire:

文件写入功能都在同一个EA中。每次,我们发出 "FILEOPEN",在我们用它做了某些任务后,我们总是用 "FILECLOSE "来跟随它。所以,我不认为被锁定的文件有问题,因为它正试图被打开。

很久以前,我们遇到过这样的问题,一个被锁定的文件被试图读取。而MT4在其日志文件中自动报告。因此,1或2天后,日志和历史文件夹变得巨大(数百Mbytes),充满了这些报告。然后,我们每次做FILEOPEN时都会发出FILECLOSE。问题得到了解决,日志和历史文件夹再也没有变得巨大。现在,日志和历史文件夹加起来只包含不到100KB(尽管错误代码5004不断弹出)。

好的,谢谢你的信息。 我没有办法了......我现在能建议的是创建一个测试EA,再现这个问题,你可以在这里发布,并作为服务台票据 的一部分发给MetaQuotes,请他们调查。
 
RaptorUK:
好的,谢谢你提供的信息。 我没有办法了......我现在能建议的是创建一个测试EA,重现这个问题,你可以在这里发布,并作为服务台票据的一部分发送给MetaQuotes,请他们调查。


亲爱的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。


谢谢你所有的帮助和信息。我会按你说的去做。

再次感谢您。


请注意。



samoye:

请问有什么办法可以解决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. 下一个循环你打开了更多的文件。