股票量化:赫茲量化系統(tǒng)中對(duì)連通器的探索
套接字
套接字是軟件實(shí)現(xiàn)的進(jìn)程間交換數(shù)據(jù)的接口。 這些過程既可以在單臺(tái) PC 上啟動(dòng),也可在連接到網(wǎng)絡(luò)里的不同 PC 上啟動(dòng)。
MQL5 僅提供客戶端 TCP 套接字。 這意味著我們能夠發(fā)起連接,但我們不能等待并響應(yīng)外部的連接請求。 所以,如果我們需要通過套接字在 MQL5 程序之間提供連通,則需要一個(gè)充當(dāng)中介的服務(wù)器。 服務(wù)器等待并偵聽端口的連接,并響應(yīng)客戶端的請求執(zhí)行某些功能。 若要連接到服務(wù)器,我們需要知道其 IP 地址和端口。
端口是一個(gè)介于 0 到 65535 之間的數(shù)字。 有三個(gè)端口范圍:系統(tǒng)保留(0 - 1023),用戶(1024 - 49151),和動(dòng)態(tài)端口(49152 - 65535)。 一些端口已分配給某些功能占用。 分配是由 IANA 執(zhí)行,該組織負(fù)責(zé)管理 IP 地址區(qū)段和頂級(jí)域名,并注冊 MIME 數(shù)據(jù)類型。
默認(rèn)情況下,端口 3306 已分配給 MySQL。 當(dāng)訪問服務(wù)器時(shí),我們將與其連接。 請注意,此端口值可以更改。 因此,在開發(fā) EA 時(shí),應(yīng)在輸入中設(shè)置端口以及 IP 地址。
Wireshark 流量分析器
流量分析器有助于調(diào)試應(yīng)用套接字的程序代碼。 缺了它,整個(gè)過程就像不用示波器進(jìn)行電子設(shè)備維修一樣。 分析器從選定的網(wǎng)絡(luò)接口捕獲數(shù)據(jù),并以可讀形式顯示它們。 它跟蹤數(shù)據(jù)包的大小,它們之間的時(shí)間間隔,重傳和連接丟失是否存在,以及許多其他有用的數(shù)據(jù)。 它還解碼許多協(xié)議。
為了令我們自己熟悉流量分析器,我們嘗試與 “google.com” 服務(wù)器建立連接,并跟蹤該過程。 為此,編寫一個(gè)小腳本。
void OnStart() ?{ //--- Get socket handle ? int socket=SocketCreate(); ? if(socket==INVALID_HANDLE) ? ? ?return; //--- Establish connection ? if(SocketConnect(socket,"google.com",80,2000)==false) ? ? { ? ? ?return; ? ? } ? Sleep(5000); //--- Close connection ? SocketClose(socket); ?}
為此,首先我們創(chuàng)建一個(gè)套接字,并利用 SocketCreate() 函數(shù)獲取其控柄。 在這種情況下,按參考資料的說辭,您可能會(huì)得到兩種情況的錯(cuò)誤,盡管這幾乎是不可能的:
ERR_NETSOCKET_TOO_MANY_OPENED 錯(cuò)誤信號(hào)表示已有多于 128 個(gè)以上的套接字被打開。
出現(xiàn) ERR_FUNCTION_NOT_ALLOWED 錯(cuò)誤則表示嘗試從指標(biāo)里調(diào)用套接字創(chuàng)建,而此功能是被禁止的。
得到控柄后,嘗試建立連接。 在本示例中,我們連接到 “google.com” 服務(wù)器(不要忘記在終端設(shè)置中將其添加到允許的服務(wù)器地址中),即連接到端口 80,且超時(shí)為 2000 毫秒。 建立連接之后,等待 5 秒鐘,然后將其關(guān)閉。 現(xiàn)在,我們在流量分析器窗口中看看它的樣子。
頂部的三個(gè)數(shù)據(jù)包代表建立連接,而底部的三個(gè)數(shù)據(jù)包代表將其關(guān)閉。 “Time(時(shí)間)” 列顯示數(shù)據(jù)包之間的時(shí)間,我們可以看到 5 秒鐘的停頓時(shí)間。 請注意,數(shù)據(jù)包的顏色為綠色,與圖例 2 中的不同。 這是因?yàn)樵谥暗那闆r下,分析器在數(shù)據(jù)交換中檢測到 MySQL 協(xié)議。 在當(dāng)前情況下,沒有數(shù)據(jù)經(jīng)過,分析器使用默認(rèn)的 TCP 顏色顯示數(shù)據(jù)包。
數(shù)據(jù)交換
根據(jù)協(xié)議,MySQL 服務(wù)器應(yīng)在建立連接后發(fā)送應(yīng)答語。 作為響應(yīng),客戶端發(fā)送授權(quán)請求。 在 dev.mysql.com 網(wǎng)站上,該機(jī)制于連接階段部分進(jìn)行了詳細(xì)闡述。 如果未收到服務(wù)端的應(yīng)答語,則 IP 地址無效,或服務(wù)器正在偵聽其它端口。 無論何種情況,這意味著我們已連接的絕對(duì)不是 MySQL 服務(wù)器。 在正常狀況下,我們需要接收數(shù)據(jù)(從套接字讀取數(shù)據(jù)),并解析它。