Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1546
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Теперь да, журнал заполняется. Я пока принт сделал:
Принтует значение 500 в оба буфера
Значения MA у вас попадают в массив MAValue. А переменная bufferMA должна быть типа int, и в неё возвращается количество скопированных значений. Не понятно, почему у вас туда попадает 500, а не 200.
Это я по ходу пьесы изменил totalBars на 500. Большое спасибо за помощь!
Теперь я хочу
//3. Создать массив для хранения отклоненийЯ не понимаю, как лучше сделать. У меня есть два массива с ценами теперь (значения МА и хаи).Таким образом, мне надо перебрать "totalBars" баров циклом? И когда хай будет был больше МА200, и записать это отклонение в массив?
Теперь я хочу
3. Создать массив для хранения отклонений
Я не понимаю, как лучше сделать. У меня есть два массива с ценами теперь (значения МА и хаи).Таким образом, мне надо перебрать "totalBars" баров циклом? И когда хай будет был больше МА200, и записать это отклонение в массив?
Почти всё правильно. Объявляете новый массив. Устанавливаете его размер через вызов ArrayResize(totalBars). Затем в цикле каждому элементу нового массива просто присваиваете соответствующую разницу элементов из хай и МА. Ну а потом уже делайте с ними всё остальное - сортируйте и проходите по первым 50 элементам с сохранением в файл.
Не заметил, что разговор про скрипт.
Если в скрипт, то так:
Не забудьте разрешить 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
Всё работает.
Кстати.