错误代码5004 - 页 2

 
mfilename = StringSubstr(OrderTicket(),StringLen(OrderTicket())-7,7) + ".DAT";

fhandle=FileOpen(mfilename, FILE_BIN|FILE_READ);

if(fhandle<=0)

{ Alert( "File:", mfilename, " not found, the last error is: ", GetLastError());

filewriting(mfilename); }

        if(fhandle>0)

FileClose(fhandle);
 
raisingfire:

这是打开文件和关闭文件的部分。

我使用标准的MQL4文件函数,而不是DLL调用。

你能不能添加以下内容,并汇报一下输出情况。

mfilename = StringSubstr(OrderTicket(),StringLen(OrderTicket())-7,7) + ".DAT";

Print("Filename:  ", mfilename);    // <--- add this line

fhandle=FileOpen(mfilename, FILE_BIN|FILE_READ);

if(fhandle<=0)

{ Alert( "File:", mfilename, " not found, the last error is: ", GetLastError());

filewriting(mfilename); }

        if(fhandle>0)

FileClose(fhandle);


您是否确认该文件存在于正确的 目录中? 它不再应该在experts\files..它必须在MQL4\Files 中,您可以通过点击File > Open data Folder 在MT4中找到正确的MQL4文件夹。

 
  1. mfilename = StringSubstr(OrderTicket(),StringLen(OrderTicket())-7,7) + ".DAT";

    Orderticket 是一个int,StringLen 期望是一个字符串。

    订单票据
    字符串Len 弦外之音
    12345678
    8
    ("12345678", 1, 7) = "2345678"
    1234567
    7
    ("12345678", 0, 7) = "1234567"
    1234566("123456", -1, 7) 无效

    因此,如果数字的数量<7(如在测试器中),则调用失败。 >7的前导数字被删除?

    尝试IntegerToString( OrderTicket(), 7, '0') + ".DAT" // 12345 -- 0012345.DAT

  2. 在MetaTrader 4 Build 600和更高版本中 没有experts/files 数据结构 - MQL4文章
 
RaptorUK:

你能添加以下内容并报告输出情况吗?


你是否确认文件存在于正确的 目录中? 它不再应该在experts/files..它必须在MQL4\Files 中,您可以通过点击文件>打开数据文件夹,在MT4中找到正确的MQL4文件夹。


RaptorUK:

你能添加以下内容并报告输出结果吗 ......


您是否确认该文件存在于正确的 目录中? 它不再应该在experts\files..它必须在MQL4\Files 中,您可以通过点击文件>打开数据文件夹 在MT4中找到正确的MQL4文件夹。

亲爱的RaptorUK。

我在此附上打印语句后的日志文件。

我知道文件夹结构在Build 610中被改变了。但后来,终端客户程序应该自动调整,因为我使用的是默认的文件夹。

谢谢你的帮助。

 
WHRoeder:
  1. Orderticket 是一个int,StringLen 期望是一个字符串。

    订单票据
    字符串Len 弦外之音
    12345678
    8
    ("12345678", 1, 7) = "2345678"
    1234567
    7
    ("12345678", 0, 7) = "1234567"
    1234566("123456", -1, 7) 无效

    因此,如果数字的数量<7(如在测试器中),则调用失败。 >7的前导数字被删除?

    尝试IntegerToString( OrderTicket(), 7, '0') + ".DAT" // 12345 -- 0012345.DAT

  2. 在MetaTrader 4 Build 600和更高版本中 没有experts/files 数据结构 - MQL4 文章


亲爱的WHRoder。

我尝试了你的建议,但它仍然给我同样的错误代码。5004.你指出了一个很好的信息,即orderticket返回int。但是,旧的客户终端程序(build 580 something)并没有返回任何编译错误或运行时错误。 正如我之前提到的,这个错误代码5004似乎根本不影响我的EA性能。我的EA仍然可以在正确的条件下开仓和平仓。

我使用的是默认目录,我没有指定具体的目录。我可以看到文件在那里,但它仍然无法打开它们。更加令人困惑的是,它并不总是失败。大多数时候,它都能成功打开文件。我已经添加了另一个条件来测试它是否成功打开文件。成功率大约是10:1,其中1是指文件打开失败。

谢谢你的帮助。

 

你使用的是什么版本

也许是UAC的问题

 
//you are looking for a word in a number.... twice... It's like asking how many ounces are in a foot. Wrong datatype.
//Change your ticket number to a string.

string ticketString=IntegerToString(OrderTicket());
//now your ticket number is a string.

mfilename = StringSubstr(ticketString,StringLen(ticketString)-7,7) + ".DAT";
//now you are asking for the substring and length of a string instead of an integer.

fhandle=FileOpen(mfilename, FILE_BIN|FILE_READ);

if(fhandle == -1)
//if you are getting an INVALID HANDLE that is -1 you could also just say <0 instead of <=0 this may be why it only fails some times.

{ Alert( "File:", mfilename, " not found, the last error is: ", GetLastError());

filewriting(mfilename); }

        if(fhandle>0)

FileClose(fhandle);

正如WHRoeder所说的那样......如果你使用的是测试器,而它没有使用至少包含7位数字的票据号码,那么你就要求它寻找从6减7(ticketString-7)或-1位置开始的子串,这将使它落空。你还提到了 "默认 "文件夹。

默认 "文件夹已经和以前不同了。我不得不假设,当你说'默认'时,你是在说Mql4/files的新'默认'文件夹......而不是在旧的experts/files。

确保你采纳了上面的建议,使用文件>打开数据文件夹,并查看你的平台所使用的实际位置。如果你使用UAC,它可能在用户/appdata中,正如有人建议的那样......这很好,只要你知道它并在需要时相应地调整你的路径。

如果交易正常的话,显然这部分代码只是为了记录 记录,而不是策略的一个组成部分。希望这些建议能帮助你实现无误运行。欢迎来到论坛!

PipPip...Jimdandy

 
qjol:

你使用的是什么版本

也许是UAC的问题


我目前使用的客户终端是Build 610。
 
Jimdandy:

正如WHRoeder所说的那样......如果你使用的是测试器,而它没有使用至少包含7位数字的票据号码,那么你就要求它寻找从6减7(ticketString-7)或-1位置开始的子串,这将使它落空。你还提到了 "默认 "文件夹。

默认 "文件夹已经和以前不同了。我不得不假设,当你说'默认'时,你是在说Mql4/files的新'默认'文件夹......而不是在旧的experts/files。

确保你采纳了上面的建议,使用文件>打开数据文件夹,并查看你的平台所使用的实际位置。如果你使用UAC,它可能在用户/appdata中,正如有人建议的那样......这很好,只要你知道它并在需要时相应地调整你的路径。

如果交易正常的话,显然这部分代码只是为了记录和记录,而不是策略的一个组成部分。希望这些建议能帮助你实现无误运行。欢迎来到论坛!

PipPip...Jimdandy


正如我给WHRoeder的回复,我已经按照他的建议做了,但它仍然给我同样的错误代码 5004。

对于默认文件夹,我知道文件夹结构在第610版中有所改变。我已经重新编译了我的EA,我从来没有指定我自己的文件夹。因此,我认为EA会在客户终端的默认文件夹中创建并寻找DAT文件。而且证实了大多数时候,FILEOPEN是成功的。只有10%的相同语句失败。(我正在使用简单的if语句来测试它是否成功)。

干杯。

 
raisingfire:

亲爱的RaptorUK。

这里我附上了打印语句后的日志文件。

我知道文件夹结构在build 610中被改变了。但这样一来,终端客户程序应该会自动调整,因为我使用的是默认文件夹。

谢谢你的帮助。

没有附上任何文件......。

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