Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1548
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Не заметил, что разговор про скрипт.
Если в скрипт, то так:
Не забудьте разрешить dll в настройкахАлександр, добрый день!
Вы существенно мне помогли, посоветовав использовать kernel32.dll со следующей командой:
DeleteFile(TerminalInfoString(TERMINAL_DATA_PATH) + "\\Tester\\cache\\"); // Очистка Cache, чтобы гарантировать реальный прогон (а не воспроизведение данных запомненного ранее из opt-файла)
Теперь моя программа работает безукоризненно, спасибо вам большое!
Если возможно, хочу вас попросить дать еще одну команду для записи.
В моем скрипте формируется набор оптимальных параметров Settings и записывается в песочницу Files с именем NameSettings, которое формируется в коде.
Вот пример сформированного имени: 701-2.3-15097.set.
Мне требуется записать его в папку тестера: C:\Users\клыков\AppData\Roaming\MetaQuotes\Terminal\F58594996208E46D021F1E606AD322F3\MQL5\Profiles\Tester
Я думаю, это можно сделать при помощи команды WriteFile() из kernel32.dll.
Но не понимаю, с какими параметрами ее записать.
#import "kernel32.dll"
int DeleteFileW(const string file_name);
long FindFirstFileW(const string file_name, FIND_DATAWW &find_file_data);
int FindNextFileW(long find_file, FIND_DATAWW &find_file_data);
int FindClose(long find_file);
int WriteFile();
#import
Вот фрагмент кода моего скрипта:
Now = TimeLocal(); // Момент формирования имени для Settings (эта строка уже сформирована ранее)
TimeToStruct(Now,dt_struct); // Разложение момента формирования
string mnth = dt_struct.mon; // Месяц, день
int dyy = dt_struct.day;
string dy = dt_struct.day;
if(dyy <= 9)
dy = "0" + dy;
string LimPos = MTTESTER::GetValue(Settings,"LimitPosition"); // LimitPosition считывается
int PosVert = StringFind(LimPos,"|",0);
string razn = StringSubstr(LimPos,PosVert,-1);
StringReplace(LimPos,razn,"");
NameSettings = mnth+dy+"-"+LimPos+"-"+DoubleToString(ProfitNew,0)+".set"; // Формируется имя для Settings
int file_handle=FileOpen("//"+NameSettings,FILE_READ|FILE_WRITE|FILE_CSV|FILE_ANSI);
FileWriteString(file_handle,Settings+"\r\n"); // Записывается строка Settings в песочницу Files
Вот здесь и хотелось бы добавить эту команду записи в папку Tester.
Помогите, пожалуйста!
С уважением, Александр
Александр, добрый день!
Вот выдрал у себя из кода как копировать файл из папки в папку.
Я не помню, что я копировал и куда, но мне кажется это то, что вам нужно)))
Попробуйте разобраться.
Ага, вспомнил чуть. Код избыточен для вас. Он копирует файл оптимизации из папки тестер в куда то. Причём выбирает самый последний(свежий) файл. Вот эта оценка свежести, думаю вам не нужна)
ЗЫЫ всё что вам из всего этого надо это CopyFileW,всё остальное вода)))
Добавил такие команды:
string PathName = TerminalInfoString(TERMINAL_DATA_PATH);
string Path = PathName + "\\Files\\";
string FileNew = PathName + "\\MQL5\\Profiles\\Tester\\" + NameSettings + "\\";
Print("PathName= ",PathName);
Print("Path= ",Path);
Print("FileNew= ",FileNew);
bool aaa = CopyFileW(Path + NameSettings, FileNew, false);
PrintFormat("Error %d",GetLastError()); // информация о неудачной операции
Print("aaa= ",aaa);
В результате получил:
PathName= C:\Users\клыков\AppData\Roaming\MetaQuotes\Terminal\F58594996208E46D021F1E606AD322F3
Path= C:\Users\клыков\AppData\Roaming\MetaQuotes\Terminal\F58594996208E46D021F1E606AD322F3\Files\
FileNew= C:\Users\клыков\AppData\Roaming\MetaQuotes\Terminal\F58594996208E46D021F1E606AD322F3\MQL5\Profiles\Tester\702-2.3-15097.set\
Error 4009
aaa= false
ERR_NOTINITIALIZED_STRING
4009
Неинициализированная строка
Вроде все пути определены правильно, но копирования не происходит.
Сама процедура импортируется из:
#import "kernel32.dll"
int DeleteFileW(const string file_name);
long FindFirstFileW(const string file_name, FIND_DATAWW &find_file_data);
int FindNextFileW(long find_file, FIND_DATAWW &find_file_data);
int FindClose(long find_file);
bool CopyFileW(string lpExistingFileName, string lpNewFileName, bool bFailIfExists);
//int WriteFile();
#import
Добавил такие команды:
Хз.
Ну для начала я бы убрал слэш в конце этой строки
вот так
Не помогло.
Та же самая ошибка 4009.
Попробовал просто переписать файл внутри песочницы. Ошибка та же.
string PathName = TerminalInfoString(TERMINAL_DATA_PATH);
string Path = PathName + "\\Files\\";
// string FileNew = PathName + "\\MQL5\\Profiles\\Tester\\" + NameSettings;
string FileNew = PathName + "\\MQL5\\Files\\" + "f"+NameSettings;
Print("PathName= ",PathName);
Print("Path= ",Path);
Print("FileNew= ",FileNew);
bool aaa = kernel32::CopyFileW(Path + NameSettings, FileNew, false);
PrintFormat("Error %d",GetLastError()); // информация о неудачной операции
Print("aaa= ",aaa);
А результат такой:
PathName= C:\Users\lizak\AppData\Roaming\MetaQuotes\Terminal\FA97EA291D4188820508F9D2B5AAD50F
Path= C:\Users\lizak\AppData\Roaming\MetaQuotes\Terminal\FA97EA291D4188820508F9D2B5AAD50F\Files\
FileNew= C:\Users\lizak\AppData\Roaming\MetaQuotes\Terminal\FA97EA291D4188820508F9D2B5AAD50F\MQL5\Files\f702-2.3-15097.set
Error 4009
aaa= false
Не помогло.
Создал в папке C:\Users\Ya\AppData\Roaming\MetaQuotes\Terminal\FA97EA291D4188820508F9D2B5AAD50F\MQL5\Files файл с таким именем File.csv
Запускаю скрипт.
Файл как и задуманно копируется в папку C:\Users\Ya\AppData\Roaming\MetaQuotes\Terminal\FA97EA291D4188820508F9D2B5AAD50F
Всё работает.
Кстати.
Создал в папке C:\Users\Ya\AppData\Roaming\MetaQuotes\Terminal\FA97EA291D4188820508F9D2B5AAD50F\MQL5\Files файл с таким именем File.csv
Запускаю скрипт.
Файл как и задумано копируется в папку C:\Users\Ya\AppData\Roaming\MetaQuotes\Terminal\FA97EA291D4188820508F9D2B5AAD50F
Всё работает.
К сожалению, ваш код у меня не сработал.
Тогда я еще более упростил задачу: переписать файл внутри песочницы, но с новым именем:
Вот, что он распечатал:
Path = C:\Users\клыков\AppData\Roaming\MetaQuotes\Terminal\F58594996208E46D021F1E606AD322F3
LastPath = C:\Users\клыков\AppData\Roaming\MetaQuotes\Terminal\F58594996208E46D021F1E606AD322F3\MQL5\Files\File.csv
NewPath = C:\Users\клыков\AppData\Roaming\MetaQuotes\Terminal\F58594996208E46D021F1E606AD322F3\MQL5\Files\New_File.csv
Error 0
res = false
Нового файла в папке Files не появилось.
Удивительно, что Error 0 (т.е. ошибки нет), но res = false
Проверял на двух компьютерах, результат одинаковый.
Интересно, сработает ли этот код у вас?
У меня dll разрешены.
Но все же дело, наверное, в каких-то ещё настройках?
К сожалению, ваш код у меня не сработал.
Я не знаю чем вам помочь.
Проверил ещё раз, всё работает.
Как вы можете видеть копирует хоть куда и с разными именами и даже со сменой расширения.
PS Проверьте на наличие файла, может вы где то, что то путаете.
вставьте в начало скрипта
Я не знаю чем вам помочь.
Проверил ещё раз, всё работает.
Как вы можете видеть копирует хоть куда и с разными именами и даже со сменой расширения.
PS Проверьте на наличие файла, может вы где то, что то путаете.
вставьте в начало скрипта
Спасибо за юмор!
Вечером проверю