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