Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1546

 
Sergey Izhutov #:

Теперь да, журнал заполняется. Я пока принт сделал:

Принтует значение 500 в оба буфера

Значения MA у вас попадают в массив MAValue. А переменная bufferMA должна быть типа int, и в неё возвращается количество скопированных значений. Не понятно, почему у вас туда попадает 500, а не 200.
 
Yuriy Bykov #:
Значения MA у вас попадают в массив MAValue. А переменная bufferMA должна быть типа int, и в неё возвращается количество скопированных значений. Не понятно, почему у вас туда попадает 500, а не 200.

Это я по ходу пьесы изменил totalBars на 500. Большое спасибо за помощь!


Теперь я хочу

//3. Создать массив для хранения отклонений

Я не понимаю, как лучше сделать. У меня есть два массива с ценами теперь (значения МА и хаи).Таким образом, мне надо перебрать "totalBars" баров циклом? И когда хай будет  был больше МА200, и записать это отклонение в массив?

 
Sergey Izhutov #:

Теперь я хочу

3. Создать массив для хранения отклонений

Я не понимаю, как лучше сделать. У меня есть два массива с ценами теперь (значения МА и хаи).Таким образом, мне надо перебрать "totalBars" баров циклом? И когда хай будет  был больше МА200, и записать это отклонение в массив?

Почти всё правильно. Объявляете новый массив. Устанавливаете его размер через вызов ArrayResize(totalBars). Затем в цикле каждому элементу нового массива просто присваиваете соответствующую разницу элементов из хай и МА. Ну а потом уже делайте с ними всё остальное - сортируйте и проходите по первым 50 элементам с сохранением в файл.

 
Aleksandr Slavskii #:

Не заметил, что разговор про скрипт.

Если в скрипт, то так:

Не забудьте разрешить 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.


Помогите, пожалуйста!


С уважением, Александр


 
klycko #:

Александр, добрый день!

Вот выдрал у себя из кода как копировать файл из папки в папку.

Я не помню, что я копировал и куда, но мне кажется это то, что вам нужно)))

Попробуйте разобраться. 

#define MAX_PATH                       260

struct FILETIME
  {
   uint              dwLowDateTime;
   uint              dwHighDateTime;
  };
struct FIND_DATAW
  {
   uint              dwFileAttributes;
   FILETIME          ftCreationTime;
   FILETIME          ftLastAccessTime;
   FILETIME          ftLastWriteTime;
   uint              nFileSizeHigh;
   uint              nFileSizeLow;
   uint              dwReserved0;
   uint              dwReserved1;
   short             cFileName[MAX_PATH];
   short             cAlternateFileName[14];
  };

#import "user32.dll"
bool CopyFileW(string lpExistingFileName, string lpNewFileName, bool bFailIfExists);
long FindFirstFileW(const string file_name, FIND_DATAW &find_file_data);
int  FindNextFileW(long find_file, FIND_DATAW &find_file_data);
int  FindClose(long find_file);
#import
//+------------------------------------------------------------------+
bool IsCopi(string Name)
  {
//---находим файл с фреймами
   string FileName = "";
   string FileNameTemp = "";
   int count = 0;
   long search_handle = FileFindFirst("Tester\\*.mqd", FileNameTemp);
   do
     {
      if(FileNameTemp != "")
         count++;
      if(count > 1)
        {
         if(FileGetInteger("Tester\\" + FileNameTemp, FILE_CREATE_DATE, false) > FileGetInteger("Tester\\" + FileName, FILE_CREATE_DATE, false))
            FileName = FileNameTemp;
        }
      else
         FileName = FileNameTemp;
     }
   while(FileFindNext(search_handle, FileNameTemp));
   FileFindClose(search_handle);

   FileCopy("Tester\\" + FileName, 0, "ResOpt\\" + Name + "\\" + FileName, FILE_REWRITE);
//---
   string PathName = TerminalInfoString(TERMINAL_DATA_PATH);
   string Path = PathName + "\\Tester\\cache\\";
   string File = GetFileName(Path);
   string FileNew = PathName + "\\MQL5\\Files\\ResOpt\\" + Name + "\\" + File;

   int aaa = CopyFileW(Path + File, PathName + "\\MQL5\\Files\\ResOpt\\" + File, false);
   Sleep(300);
   FileCopy("ResOpt\\" + File, 0, "ResOpt\\" + Name + "\\" + File, FILE_REWRITE);
   FileDelete("ResOpt\\" + File);

   return true;
  }
//+------------------------------------------------------------------+
// Получает имя файла оптимизации
string GetFileName(string Path)
  {
   FIND_DATAW FindData;
   FindData.cFileName[0] = 0;
   const long handle = FindFirstFileW(Path + "*.opt*", FindData);
   string FileName = "";
   if(handle != INVALID_HANDLE)
     {
      do
        {
         FileName = ShortArrayToString(FindData.cFileName);
        }
      while(FindNextFileW(handle, FindData));

      FindClose(handle);
     }

   return(FileName);
  }
//+------------------------------------------------------------------+


Ага, вспомнил чуть. Код избыточен для вас. Он копирует файл оптимизации из папки тестер в куда то. Причём выбирает самый последний(свежий) файл. Вот эта оценка свежести, думаю вам не нужна)

ЗЫЫ  всё что вам из всего этого надо это 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

 
klycko #:

Добавил такие команды:

Хз.

Ну для начала я бы убрал слэш в конце этой строки

FileNew= C:\Users\клыков\AppData\Roaming\MetaQuotes\Terminal\F58594996208E46D021F1E606AD322F3\MQL5\Profiles\Tester\702-2.3-15097.set\

вот так

string FileNew = PathName + "\\MQL5\\Profiles\\Tester\\" + NameSettings;
 

Не помогло.

Та же самая ошибка 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


 
klycko #:

Не помогло.

Создал в папке  C:\Users\Ya\AppData\Roaming\MetaQuotes\Terminal\FA97EA291D4188820508F9D2B5AAD50F\MQL5\Files  файл  с таким именем File.csv

Запускаю скрипт.

Файл как и задуманно копируется в папку   C:\Users\Ya\AppData\Roaming\MetaQuotes\Terminal\FA97EA291D4188820508F9D2B5AAD50F

Всё работает.

#import "kernel32.dll"
bool CopyFileW(string lpExistingFileName, string lpNewFileName, bool bFailIfExists);
#import
//+------------------------------------------------------------------+
void OnStart()
  {
   string File = "File.csv";
   string Path = TerminalInfoString(TERMINAL_DATA_PATH);
   string LastPath = Path + "\\MQL5\\Files\\" + File;  
   string NewPath = Path + "\\" + File;                
   bool res = kernel32::CopyFileW(LastPath, NewPath, false);
   Print(res);
  }
//+------------------------------------------------------------------+
 
klycko #:

Кстати.

123589