最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

期貨股票量化交易軟件:分組文件的操作

2023-08-18 16:58 作者:bili_45793681098  | 我要投稿

簡介

讀取或?qū)懭胍粋€文件不是問題。甚至可以使用通過 WINAPI 進行文件操作一文中描述的 WinAPI 實現(xiàn)。。但如果我們不知道文件的確切名稱,只知道文件所在的文件夾和擴展名,該怎么做呢?當然,可以手動輸入必要的名稱作為參數(shù),但如果有十個或更多這種文件該怎么做呢?赫茲量化需要一種方法,對給定文件夾內(nèi)相同類型的文件進行分組處理。利用 kernel32.dll 中包含的 FindFirstFile()、FindNextFile() 和 FindClose() 函數(shù),可以有效的解決這個問題。

編輯切換為居中

FindFirstFile() 函數(shù)

HANDLE WINAPI FindFirstFile( ? __in ? LPCTSTR lpFileName, ? __out ?LPWIN32_FIND_DATA lpFindFileData );

按照描述,函數(shù)返回找到的符合搜索要求的文件描述符。搜索條件在 lpFileName 變量中指定,包含了搜索文件的路徑和文件的可能名稱。該函數(shù)非常方便,赫茲量化可以用通配符指定搜索,例如,用通配符“C:\folder\*.txt”查找文件。函數(shù)將返回在“C:\folder”文件夾中找到的第一個帶有 txt 擴展名的文件。

函數(shù)返回的結(jié)果在 赫茲量化中是‘int’類型。要傳遞輸入?yún)?shù),可以使用‘字符串’類型?,F(xiàn)在我們必須解決把什么傳遞到函數(shù)作為第二個參數(shù)以及稍后如何處理參數(shù)的問題。該函數(shù)的導入大致如下:

#import "kernel32.dll" int ?FindFirstFileA(string path, .some second parameter); #import

這里我們可以看到已知的 kernel32.dll 庫。但是,函數(shù)的名稱被指定為 FindFirstFileA() 而非 FindFirstFile()。原因在于 - 該庫中的很多函數(shù)有兩個版本:如果使用 Unicode 字符串,名稱中會添加‘W’字母(FindFirstFileW),如果使用 ANSI,則添加‘A’字母(FindFirstFileA)。

現(xiàn)在赫茲量化必須解決函數(shù)第二個參數(shù)的問題,參數(shù)描述如下:

lpFindFileData [out] - 指向WIN32_FIND_DATA結(jié)構(gòu)的指針,接收已找到的文件或目錄的信息。

這意味著它是指向 WIN32_FIND_DATA 結(jié)構(gòu)的指針。在這種情況下,結(jié)構(gòu)是計算機 RAM 里的某個區(qū)域。指向該區(qū)域(地址)的指針傳遞到函數(shù)。我們可以使用數(shù)據(jù)數(shù)組在 MQL4 中分配內(nèi)存。指針以‘&’字符指定。我們只需要知道傳遞指針所需的內(nèi)存大小(以字節(jié)表示)。下面是對結(jié)構(gòu)的描述。

typedef struct _WIN32_FIND_DATA { ? DWORD dwFileAttributes; ? FILETIME ftCreationTime; ? FILETIME ftLastAccessTime; ? FILETIME ftLastWriteTime; ? DWORD nFileSizeHigh; ? DWORD nFileSizeLow; ? DWORD dwReserved0; ? DWORD dwReserved1; ? TCHAR cFileName[MAX_PATH]; ? TCHAR cAlternateFileName[14]; } WIN32_FIND_DATA,


在赫茲量化 中,沒有 DWORD、TCHAR 或 FILETIME 類型。DWORD 占據(jù) 4 個字節(jié),跟 赫茲量化中的 int 類似,TCHAR 有一個字節(jié)的內(nèi)部形式。要計算 WIN32_FIND_DATA 結(jié)構(gòu)的總大?。ㄗ止?jié)數(shù)),赫茲量化只需要弄清 FILETIME 是什么。

typedef struct _FILETIME { ? DWORD dwLowDateTime; ? DWORD dwHighDateTime; } FILETIME

FILETIME 包含兩個 DWORD,意味著是 8 個字節(jié)。我們將其做成表格:


類型

字節(jié)數(shù)

DWORD

4

TCHAR

1

FILETIME

8


現(xiàn)在我們可以計算 WIN32_FIND_DATA 結(jié)構(gòu)的大小并將其中發(fā)現(xiàn)的內(nèi)容可視化。

類型

字節(jié)數(shù)

dwFileAttributes

4

文件屬性

ftCreationTime

8

文件/文件夾創(chuàng)建時間

ftLastAccessTime

8

最后訪問時間

ftLastWriteTime

8

最后寫入時間

nFileSizeHigh

4

最大字節(jié)數(shù)

nFileSizeLow

4

最小字節(jié)數(shù)

dwReserved0

4

通常不定義或不使用

dwReserved1

4

為未來保留

cFileName[MAX_PATH]

260 (MAX_PATH = 260)

文件名稱

cAlternateFileName[14]

14

8.3 格式的替代名稱


結(jié)構(gòu)的總大小為:4 + 8 + 8 + 8 + 4 + 4 + 4 +4 + 260 +14 = 318 字節(jié)。


編輯切換為居中


從上圖可以看出,文件名稱從第 45 個字節(jié)開始,前面的 44 個字節(jié)包含了各種輔助信息。需要將赫茲量化中一些大小為 318 字節(jié)的結(jié)構(gòu)(如第二個參數(shù))傳遞到 FindFirstFile() 函數(shù)。使用‘int’類型的數(shù)組最為方便,其大小不小于要求的大小。將 318 除以 4(因為‘int’類型的內(nèi)部形式是 4 個字節(jié)),得到 79.5,圓整到最接近的較大整數(shù),可見我們需要 80 個元素的數(shù)組。

現(xiàn)在導入函數(shù)顯示如下:

#import "kernel32.dll" int ?FindFirstFileA(string path, int & answer[]); #import

這里我們使用了名稱末尾帶字母‘A’的函數(shù)版本,即 ANSI 編碼的 FindFirstFileA()。‘a(chǎn)nswer’數(shù)組通過鏈接傳遞,由 WIN32_FIND_DATA 結(jié)構(gòu)填充。調(diào)用示例:

? int win32_DATA[80]; ? int handle = FindFirstFileA(TerminalPath() + "\experts\*.mq4",win32_DATA);

FindNextFileA() 和 FindClose() 函數(shù)


FindNextFileA() 接收由函數(shù) FindFirstFileA() 或另一個較早調(diào)用的函數(shù) FindNextFileA() 初步獲得文件的‘句柄’(作為第一個參數(shù))。第二個參數(shù)相同。FindClose() 函數(shù)僅關(guān)閉搜索。這就是為什么導入函數(shù)數(shù)據(jù)的完整顯示如下:

#import "kernel32.dll" int ?FindFirstFileA(string path, int & answer[]); bool FindNextFileA(int handle, int & answer[]); bool FindClose(int handle); #import

現(xiàn)在我們只要學習如何提取寫入‘a(chǎn)nswer[]’數(shù)組的文件名稱。

獲得文件名稱

文件名稱包含在數(shù)組中,從第 45 個字節(jié)到第 304 個字節(jié)?!甶nt’類型包含 4 個字節(jié),如果假設數(shù)組用字符填充,每個數(shù)組元素包含 4 個字節(jié)。為了引用文件名稱的第一個字符,我們應該跳過‘a(chǎn)nswer[]’數(shù)組的 44/4=11 個元素。文件名稱位于 65(260/4=65)個數(shù)組元素鏈內(nèi),始于‘a(chǎn)nswer[11]’(索引從零開始),終于‘a(chǎn)nswer[76]’。

這樣,我們可以從數(shù)組‘a(chǎn)nswer[]’的位塊得到文件的名稱,每個位塊有 4 個字符?!甶nt’數(shù)字代表了 32 個位序列,其中有 4 個位塊,每個位塊有 8 位。


編輯切換為居中


最新的字節(jié)在右側(cè),最舊的字節(jié)在左側(cè)。位以升序排列,即從第 1 位到第 8 位構(gòu)成最新的字節(jié)。我們可以使用逐位運算提取所需的字節(jié)。為了得到最新字節(jié)的值,我們應該將從第 9 到 32 位的所有位用零填充。使用邏輯運算 AND 來完成。

int a = 234565; int b = a & 0x000000FF;

這里的 0x000000FF 是 32 位的整數(shù),從第 9 位開始的所有位都等于零,從第 1 到第 8 位均等于 1。因此,獲得的數(shù)字b只會包含數(shù)字a。我們使用 CharToStr() 函數(shù)將獲得的字節(jié)(字符代碼)轉(zhuǎn)換為單個字符的字符串。

好了,我們已經(jīng)獲得了第一個字符。如何獲得第二個呢?很簡單:我們向右偏移 8 個位,第二個位取代了最新的位。然后我們應用已知的邏輯運算AND 。

int a = 234565; int b = (a >>8) & 0x000000FF;

你可以猜測得到,偏移 16 位可以得到第三個字節(jié),偏移 24 位可以得到最舊的字節(jié)。這樣,我們可以從‘int'類型數(shù)組的一個元素中提取 4 個字符。下面顯示了如何從‘a(chǎn)nswer[]’數(shù)組獲得文件名稱的前 4 個字符:

? string text=""; ? ? int pos = 11; ? int curr = answer[pos]; ? ? ?{ ? ? ?text = text + CharToStr(curr & 0x000000FF) ? ? ? ? +CharToStr(curr >> 8 & 0x000000FF) ? ? ? ? +CharToStr(curr >> 16 & 0x000000FF) ? ? ? ? +CharToStr(curr >> 24 & 0x000000FF); ? ? ?} ? ?Print("text = ", text);

我們來創(chuàng)建一個單獨的函數(shù),從命名為‘buffer’的傳遞的數(shù)組返回文本字符串。

//+------------------------------------------------------------------+ //| ?read text from buffer ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+ string bufferToString(int buffer[]) ? { ? string text=""; ? ? int pos = 10; ? for (int i=0; i<64; i++) ? ? ?{ ? ? ?pos++; ? ? ?int curr = buffer[pos]; ? ? ?text = text + CharToStr(curr & 0x000000FF) ? ? ? ? +CharToStr(curr >> 8 & 0x000000FF) ? ? ? ? +CharToStr(curr >> 16 & 0x000000FF) ? ? ? ? +CharToStr(curr >> 24 & 0x000000FF); ? ? ?} ? return (text); ? }

現(xiàn)在,從結(jié)構(gòu)獲得文件名稱的問題已經(jīng)解決。


期貨股票量化交易軟件:分組文件的操作的評論 (共 條)

分享到微博請遵守國家法律
车致| 乐业县| 罗甸县| 峨眉山市| 金山区| 崇信县| 梁平县| 社会| 济宁市| 乐陵市| 德格县| 宁武县| 体育| 万山特区| 汉沽区| 昂仁县| 天津市| 福海县| 哈尔滨市| 天气| 金溪县| 乌拉特后旗| 迁西县| 青海省| 德令哈市| 紫阳县| 新源县| 北京市| 水富县| 武安市| 大新县| 德庆县| 许昌市| 太和县| 蓝田县| 泾川县| 甘肃省| 甘泉县| 茶陵县| 颍上县| 兴城市|