Код ошибки 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 вы можете найти правильную папку MQL4 в MT4, нажав Файл > Открыть папку данных

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

    Orderticket - это int, StringLen ожидает строку

    OrderTicket
    StringLen StringSubstr
    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 Вы можете найти правильную папку MQL4 в MT4, нажав Файл > Открыть папку данных.


RaptorUK:

Можете ли вы добавить следующее и сообщить о результате, пожалуйста. ...


Вы убедились, что файл существует в правильной директории? Он больше не должен находиться в experts\files. ... он должен быть в MQL4\Files вы можете найти правильную папку MQL4 в MT4, нажав Файл > Открыть папку данных

Уважаемый RaptorUK,

Здесь я прикрепил файл из журнала после выполнения оператора Print.

Я знаю, что структура папок была изменена в сборке 610. Но тогда клиентская программа терминала должна настроить ее автоматически, потому что я использую папки по умолчанию.

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

 
WHRoeder:
  1. Orderticket - это int, StringLen ожидает строку

    OrderTicket
    StringLen StringSubstr
    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. Но тогда старая клиентская терминальная программа (билд 580 какой-то) не выдавала ни ошибки компиляции, ни ошибки времени выполнения. Этот код ошибки 5004, как я уже говорил, не влияет на производительность моего советника. Мой советник по-прежнему может открывать и закрывать позиции в правильном состоянии.

Я использую каталог по умолчанию, я не указываю конкретный каталог. Я вижу, что файлы есть, но все равно не удается их открыть. Чтобы добавить больше путаницы, он не отказывает все время. В большинстве случаев файл удается открыть. Я добавил еще одно условие, чтобы проверить, удастся ли ему открыть файл. Процент успеха составляет примерно 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.

Убедитесь, что вы воспользовались предложением выше и использовали файл>Открыть папку данных и посмотрели в фактическое местоположение, которое использует ваша платформа. Она может находиться в users/appdata, если вы используете UAC, как уже было предложено... и это нормально, если вы знаете об этом и корректируете пути соответственно, если это необходимо.

Если торговля ведется правильно, очевидно, что эта часть кода предназначена только для ведения записей и журналов, а не является неотъемлемой частью стратегии. Надеюсь, некоторые из этих предложений помогут вам запустить стратегию без ошибок. Добро пожаловать на форум!

PipPip... Jimdandy

 
qjol:

какую версию вы используете

И, возможно, это проблема UAC


Текущий клиентский терминал, который я использую - сборка 610.
 
Jimdandy:

Как сказал WHRoeder выше... если вы используете тестер и он не использует номер билета, который содержит по крайней мере 7 цифр, то вы просите его искать подстроку, начинающуюся с позиции 6 минус 7(ticketString-7) или -1... что заставит его упасть. Также вы упомянули папку "по умолчанию".

Папка "по умолчанию" изменилась по сравнению с тем, какой она была раньше. Я вынужден предположить, что когда вы говорите "по умолчанию", вы имеете в виду новую папку "по умолчанию" в Mql4/files, а не старую experts/files.

Убедитесь, что вы воспользовались предложением выше и использовали файл>Открыть папку данных и посмотрели в фактическое местоположение, которое использует ваша платформа. Она может находиться в users/appdata, если вы используете UAC, как уже было предложено... что вполне нормально, если вы знаете об этом и корректируете пути соответственно, если это необходимо.

Если торговля ведется правильно, очевидно, что эта часть кода предназначена только для ведения записей и журналов, а не является неотъемлемой частью стратегии. Надеюсь, некоторые из этих предложений помогут вам запустить стратегию без ошибок. Добро пожаловать на форум!

PipPip... Jimdandy


Как я уже ответил WHRoeder, я последовал его предложению, но он все еще дает мне тот же код ошибки 5004.

Что касается папки по умолчанию, я знаю, что структура папок изменилась в билде 610. Я перекомпилировал свой советник и никогда не указывал свои собственные папки. Поэтому я предположил, что советник будет создавать и искать DAT-файлы в папках по умолчанию клиентского терминала. И подтвердилось, что большую часть времени FILEOPEN работает успешно. Только в 10% случаев это утверждение терпит неудачу. (Я использую простой оператор if для проверки успешности).

Будьте здоровы,

 
raisingfire:

Уважаемый RaptorUK,

Здесь я прикрепил файл из журнала, следующего за операцией Print.

Я знаю, что структура папок была изменена в сборке 610. Но тогда программа терминального клиента должна настроить ее автоматически, поскольку я использую папки по умолчанию.

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

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

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

Причина обращения: