MQL4課程前言

在做這門課之前我想了很多,想如何把這門課完整地教給大家,以便大家在做外匯交易時可以方便地將自己的策略實現,同時又不會那麼複雜難懂,最後還是覺得畢竟這是一門用於實踐的計算機語言的課,所以也沒有必要從最基礎的計算機開始講起了。本課將著重偏向於實戰,從最基礎的MQL語法講起,對於一些有基礎的同學前面一部分相信會比較簡單,對有MQL4編程經驗的同學可以跳過。雖然有些枯燥,但是要想開始打怪升級總是要先進行無味的修煉。

之後這門課會教大家如何去編寫一些有用的腳本、EA之類的程序並與大家探討交易系統。注意這門課僅僅只是一個引子,量化交易的世界非常大,趨勢追踪、剝頭皮、高頻交易、神經網絡、時間序列分析等等,每一塊內容都值得去深入探索開發,相信這門課會把大家帶入MQL4量化交易的大門中。

當然未來的路還是需要自己去探索的,量化交易者的目標是拿到那傳說中的聖杯,雖然它是飄渺虛無的,在途中你會經歷自己花了無數心血編寫的交易系統測試後有盈利能力的狂喜,也會經歷程序用於模擬盤測試後表現不佳的失落,甚至會經歷用於實盤後爆倉的絕望,但是在不斷地追逐過程中,你會一點點發現聖杯的蛛絲馬跡,不要停下,直到將自己變成自己的聖杯。

第一節MQL4基礎知識介紹

1.編輯器界面介紹

工欲善其事必先利其器,MT4是一款非常方便的交易軟件,其內置的MQL4語言也是量化的利器。首先讓我們看看這把利器放在哪兒:



如圖,點擊紅框中的按鈕進入編輯器,進入編輯器後的界面以及對該界面的一些簡介如下圖。



我們點擊左上角的新建按鈕(參考下圖)以新建一個腳本。步驟如下圖:



於是我們新建了我們的第一個腳本,如下圖:



上面的幾個函數如下,代表了該腳本的屬性,從上到下的意思分別是該腳本所屬的公司,網站,版本號,以及編譯方式,除了編譯方式之外其他的內容可以不考慮,關於strict編譯方式與普通編譯方式有何不同將在未來提到,因此這一部分我們可以忽略。


 #property copyright "Copyright 2019, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict


接下來是非常重要的OnStart函數,這個函數只在腳本加載以後運行一次,與其同樣重要的還有OnInit函數、OnDeinit函數、OnTick函數,這幾個函數是組成EA最基礎的三個部分,另外OnCalculate函數是組成指標的最基礎的函數,這幾個函數將在以後的課程中介紹。

現在我們有了第一個腳本,但是我們還沒有寫任何東西進去,就像一張白紙。接下來在我們在這張白紙上畫畫之前,先了解一下畫畫的基本內容。

2.數據類型和變量

2.1數據類型

我們採用程序進行交易,往往是要定義一系列變量的,那麼計算機是如何識別我們定義的變量的?一般來說,計算機會將變量大體區分為整數類型、浮點型、布爾型以及字符串,另外MQL語言增加了兩種類型分別是時間變量類型datetime以及顏色變量類型color,變量的定義可以參考下面的語句:


 void OnStart() { int a=1; //长整数类型,定义范围为-2147483648~2147483647 char b=1; //短整数类型,定义范围为-128~127 uchar c=1; //短整数类型,定义范围为0~255 short d=1; //中整数类型,定义范围为-32768~32767 ushort e=1; //中整数类型,定义范围为0~65535 uint f=1; //长整数类型,定义范围为0~4294967295 long g=1; //长整数类型,定义范围比int更大,为 -922337203685477808~9223372036854775807 ulong h=1; //长整数类型,定义范围为0~18446744071709551615 double i=123.1; //双精度浮点型,15位有效数字float j=11.005f; //单精度浮点型,6位有效数字,一般不用bool k=true; //布尔型,只有true和false两个值string l="Lesson 1"; //字符串型datetime m=D'2016.09.23 00:00:00'; //时间类型color n=clrAntiqueWhite; //颜色类型; }


可以看到整數的類型有很多,這主要是為了節約數據佔用的字節(存儲空間)。我們每聲明一個變量,都需要在計算機中有地方存儲,而計算機存儲的最小單位就是字節。比如char和uchar類型的數據只佔1個字節,而short類型則佔2個字節,int類型占4個字節。對於K線來說,有時候需要存儲K棒的數量,而K棒數量動輒幾十萬根,超過了短整型和中整型的範圍,會造成數據的溢出報錯,所以一般情況下我們用佔用的字節較少而范圍滿足要求的int來定義就可以了。注意整數類型只能定義整數,無法定義小數。

布爾類型僅有兩個值,真值true和假值false,一般布爾型用在邏輯判斷上,判定是否滿足某個條件,其中true也可以用1代替,false可以用0代替。

字符串類型用來存儲字符串,大家都知道計算機只能識別”0”和”1”,是無法直接識別你輸入的一句話的,為了讓計算機識別字符串,將字符串進行了編碼,這就是字符串類型能達到的功能。

浮點型用於存儲小數,單精度float類型和雙精度double類型區別在於存儲的小數的有效數字不同,float類型只能存儲6位有效數字,佔4個字節,而double可以存儲15位,佔用8個字節。為了方便價格的存儲,一般選用double類型。

日期時間型變量定義的開始時間是1970年1月1日,如果不採用如上的定義方法而直接輸入數字x,那麼得到的時間是從1970年1月1日起經過x秒後的日期。日期時間變量可以拆分,可以只要年月日,也可以只要時分秒。

關於顏色類型,可以打開幫助中的MQL4幫助文件,搜索“clrAliceBlue”查找更多的顏色,如下圖:



以上就是變量的一些基礎知識,現在我們來看一下我們的定義有沒有用,我們可以通過Print函數來輸出我們的結果,注意Print函數中P是大寫,代碼如下:


 void OnStart() { int a=1; Print("a的数值为"+(string)a); }


以上代碼中,Print函數輸出字符串類型,所以可以將整數類形的a轉變成字符串類型再用Print函數輸出,在其前面加上“(string)”即可將其轉換。

編譯腳本後我們回到MT4的頁面,雙擊編好的腳本,如下圖,可以看到運行腳本後輸出了“a的數值為1”,所以我們的定義是沒有問題的。其他的類型可以自己編寫輸出,在此不贅述。



2.2變量的命名

變量的命名有一套規範,一般來一個變量的名字可以由以下幾個類型組成:

1.字母或漢字,MQL4支持漢字,但是不建議使用中文,有時會出現錯誤;

2.數字;

3.下劃線

注意變量中必須要有字母或漢字

2.3全局變量與局部變量

所謂全局變量,即該變量在任何子函數中都可以用的變量,而局部變量只能用於當前函數中。全局變量的寫法如下:


 int a=1; void OnStart() { int b=2; Print("a的数值为"+(string)a); Print("b的数值为"+(string)b); }


當變量在任何函數開始前就被定義了,這樣的變量即為全局變量,如上面的變量a。而在函數中定義的變量即為局部變量,如上面的變量b。

3.運行表達式和操作運算符

3.1運算符

運算符包括算術運算符如加減乘除,關係運算符如大於、等於,布爾運算符與、或、非,賦值運算符和迭代運算符,關於運算符不做詳細的介紹,以下的代碼是各運算符在MQL4中的應用,可以參考。

 void OnStart() { int a=1; int b=1; b=2; //赋值运算; b=a*b+a/b+ab; //加减乘除运算; bool c=true; bool d=false; bool e=a && b; //与运算; e=a || b; //或运算; e=!a ; //非运算; a++; //迭代运算; Print("a的数值为"+(string)a); }


3.2關係運算式

關係運算式用來判斷兩個變量之間的關係,如大於號小於號等,如下:


 void OnStart() { int a=1; int b=2; if(a<b) { Print("b更大"); } else if(a==b) { Print("a与b相等"); } else { Print("a更大"); } }


以上的代碼的意思是比較a和b哪個更大,如果a更大則輸出“a更大”,如果b更大則輸出“b更大”,相等則輸出“a與b相等”。

注意在判斷兩個變量是否相等時用的符號是”==”,若只有一個等號是代表賦值。

4.MQL4錯誤警告及檢查

在編程過程中免不了會有很多錯誤,如何高效排除錯誤可以幫我們省去大量的時間。

當程序編譯出現問題時,我們可以在下方的錯誤和警告欄找到發生錯誤的位置,如下圖所示,在右側我們可以看到發生編譯錯誤的行和列,在下方能看到錯誤的內容。這裡的錯誤是”'w2'-undeclared identifier”,意思是沒有對w2這個變量進行定義,只要定義w2即可。



編譯沒有問題了,但是有時也會在運行時出現錯誤,可以在EA一欄中找到錯誤的記錄,如下圖所示:



可以看到上圖有一個錯誤是“zero divide in “hudge indicator.mq4””,這個錯誤的意思是在hudge indicator.mq4這個文件中出現了除以0的情況導致程序無法執行下去而中斷了。

有時程序不會提示錯誤的詳細內容,而會顯示一個錯誤代碼,這時我們可以在MQL4幫助文件中查找ERR來查找錯誤代碼對應的錯誤編號,如下圖:



這裡的錯誤就不一一講了,如果出現錯誤,別忘了可以在幫助文件中查找。

另外,有時我們會碰到沒有任何警告或錯誤,但是程序並沒有按照我們的預期來運行,這種情況總是特別麻煩,因為不知道錯誤出在哪裡,此時我們需要一塊一塊地檢查我們的程序邏輯是不是有問題,可以分段來打印程序的輸出來檢查哪裡的輸出不符合我們的預期來檢查程序的錯誤,當然也可以採用添加斷點的方式來檢驗某一段程序。

雙擊行號可以添加程序斷點,如下圖的第87行和90行,添加斷點後按F5進入調試模式,然後按F11可以一步一步清晰地看到程序執行的步驟。一般來說調試模式用於調試循環語句。



下面再說幾個編程時常犯的錯誤:

1.語句中忘記在結尾加“;”號;

2.已經定義的變量在同一個函數中再定義了一次;

3.在子函數中定義的變量名字與全局變量重名;

4.在邏輯判斷時需要用“==”兩個等號,但是只用了一個等號“=”;

以上是本節課程的內容,這節課中我們知道了MQL4的一些基礎的知識和操作,知道瞭如何去排錯,下節課將介紹MQL4的一些常用語句。


更多內容請關注公眾號【火象】~