記事"MQL5 プログラミングの基礎: ファイル"についてのディスカッション - ページ 2

 
Artyom Trishkin:

mql5のヘルプにだけ、まだそれについての記述がない......。

4ではあるのだろうか?

FileSaveは 14日からすでにヘルプに載っています。

サイトから手動でアップデートできる

 
Andrey F. Zelinsky:

参考文献の分かりやすさについて少しコメントする。

リファレンスの位置がすぐにはわからなかった(明らかな控えめな表現がある):

いつものように批判する前にヘルプを読むべきだ。例題が役に立たないのであれば、どのような参考文献も無力です。

void OnStart()
  {
   string  filename=_Symbol+"_ticks.bin";
   MqlTick ticks[];
//---
   int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,0,ticks_to_save);
   if(copied!=-1)
     {
      PrintFormat(" CopyTicks(%s) copied %d ticks",_Symbol,copied);
      //--- ティック履歴が同期されている場合、エラーコードはゼロになります。
      if(!GetLastError()==0)
         PrintFormat("%s: Ticks are not synchronized, error=%d",_Symbol,copied,_LastError);
      //--- 刻みをファイルに書き込む
      if(!FileSave(filename,ticks,FILE_COMMON))
         PrintFormat("FileSave() failed, error=%d",GetLastError());
     }
 
Andrey F. Zelinsky:

もしお望みなら、賞賛以外のことは一切書きません。もし私が賞賛し始めたら、皮肉だなどと言うだろう。私は喜べない。

このフレーズがわかるなら


わかる

intcommon_flag=0// ファイルフラグを指定すると、デフォルトではファイルは<data catalog>MQL5Filesフォルダに書き込まれる。

 
Artyom Trishkin:

mql5のヘルプにだけ、まだそれについての記述がない......。

4ではあるのでしょうか?

残念ながら、4番目のバージョンでは何もありません。
 
ファイルとフォルダーのリストを取得する便利な関数を書いてみよう。

残念ながら、この関数は完全なリスト(すべてのサブフォルダーとその中のファイルを含む)を提供しない。そのため、次のように追加する。

string GetDirectory( const string FileName )
{
  int Pos = StringFind(FileName, "\\");
  int LastPos = Pos;
  
  while (Pos >= 0)
  {
    LastPos = Pos;
    
    Pos = StringFind(FileName, "\\", Pos + 1);
  }

  return((LastPos >= 0) ? StringSubstr(FileName, 0, LastPos + 1) : "");
}

// フィルターによる全ファイルのリストを返す
int GetFileNames( string &FileNames[], int Pos = 0, string Filter = "*", const int Common_Flag = 0 )
{
  string FileName;
  const long handle = FileFindFirst(Filter, FileName, Common_Flag);

  if (handle != INVALID_HANDLE)
  {    
    const string Directory = GetDirectory(Filter);    
    Filter = StringSubstr(Filter, StringLen(Directory));
    
    do
    {
      const string TmpFileName = Directory + FileName;
      
      ArrayResize(FileNames, Pos + 1);      
      FileNames[Pos] = TmpFileName;      
      Pos++;
        
      if (!FileIsExist(TmpFileName, Common_Flag))
        Pos = GetFileNames(FileNames, Pos, TmpFileName + Filter, Common_Flag);
    }
    while (FileFindNext(handle, FileName));  
    
    FileFindClose(handle);
  }
  
  return(Pos);
}

フィルタの意味は記事と同じだ。アプリケーションの例

// サンドボックスの構造全体をログに記録する。
void OnStart()
{
  string FileNames[];
  
  const int Amount = GetFileNames(FileNames);
  
  for (int i = 0; i < Amount; i++)
    Print(FileNames[i]);
}
 

一つの場所とトピックに

取引、自動取引システム、取引戦略のテストに関するフォーラム

mql5言語の特徴、仕事の機微とテクニック

fxsaber, 2017.08.15 17:30

// フォルダーを移動する。説明は FileMove -https://www.mql5.com/ja/docs/files/filemove と同じです。
bool FolderMove( const string FolderNameSrc, const string FolderNameDst, const int Common_Flag = 0, const int Mode_Flags = FILE_REWRITE )
{
  if (FolderNameSrc == FolderNameDst)
    return(false);

  string FileName;
  const long handle = ::FileFindFirst(FolderNameSrc + "\\*", FileName, Common_Flag);

  bool Res = false;

  if (handle != INVALID_HANDLE)
  {
    do
    {
      const string TmpFileNameSrc = FolderNameSrc + "\\" + FileName;
      const string TmpFileNameDst = FolderNameDst + "\\" + FileName;

      if (::FileIsExist(TmpFileNameSrc, Common_Flag))
        Res = ::FileMove(TmpFileNameSrc, Common_Flag, TmpFileNameDst, Mode_Flags);
      else
      {
        const string TmpFileNameSrc2 = ::StringSubstr(TmpFileNameSrc, 0, ::StringLen(TmpFileNameSrc) - 1);
        const string TmpFileNameDst2 = ::StringSubstr(TmpFileNameDst, 0, ::StringLen(TmpFileNameDst) - 1);

        if (!FolderMove(TmpFileNameSrc2, TmpFileNameDst2, Common_Flag, Mode_Flags))
          Res = ::FolderCreate(TmpFileNameDst2, Mode_Flags & FILE_COMMON);
      }
    }
    while (::FileFindNext(handle, FileName));

    ::FileFindClose(handle);
  }

  return(::FolderDelete(FolderNameSrc, Common_Flag) && Res);
}
 

この記事は素晴らしい。

 

記事に誤字があります。関数「区切り文字を含むファイルを配列に読み込む」の説明の中で、構造体についての記述があります:

struct SLine{
   string line[];
};

となっているはずです(スクリプトではそうなっています):

struct SLine{
   string field[];
};
 

А как можно уменшить размер файла?BIN файл в которой поддерживаю какие то данни, потом делаю дефрагмент файла и наконец хочу умешнит его длина, потому что сзади уже есть лишное пространство.Как етого сделать?FileResize(int newSize) を使ってください。

 
この記事、特に#property tester_fileについては、本当にありがとうございます。