【零基礎】MT4量化入門三:寫一個雙均線指標


一、前言

  原本已經放棄的,但因為一些需要又寫了一個MT4的指標,所以這里就繼續總結一下為后來人鋪路。

  現在發現除了用C語言、不好使的公用函數外,MT4寫指標或者EA其實難度都不大,就是很多地方超出你的預計很難受。

  這里我寫一個雙均線的指標,邏輯就是一個均線用最大值MA(HMA),另一個均線用最小值的MA(LMA),當最新值下穿HMA做空,上穿LMA做多,跟BOLL的邏輯有點像。由於自帶函數不好使,所以這里我自己還寫了一些功能函數。

二、新建一個指標

  在MT4里,指標與EA是有點區別的,具體區別后面再說,這里先新建一個指標。

  1)在MQ編輯窗口中:文件->新建

 

  2)選“自定義指標”->下一步

  3)指標命名成“DMA”。

  這里的參數就是指標啟動時可以修改的參數,這里我們不添加參數,在代碼里可以手寫。

 

   4)默認就只要個OnCalculate(),意思是每當有一個行情更新就觸發執行一次這個函數。繼續下一步。

 

   5)這里的“獨立窗口指標”,意思是這個指標在副圖繪制,如果不勾選就在K線圖(主圖)上繪制,我們這個是在主圖繪制的,自然是不勾選了,而且代碼里也是可以修改的。

  另外,這里可以提前設置你需要繪制的指標線顏色和類型,一共也就那么幾種,我也是在代碼里設置,不在這里添加。繼續下一步。

 

   6)一個全新的指標就建好了。所有的指標文件都在Indicators目錄中。

 

 

三、基本說明

  在看到MT4這一簡短的初始代碼時,當然會有點懵的,其實邏輯不復雜。每當有一個bar來到時,就觸發一下OnCalculate()這個函數,同時這個函數使用參數傳遞了你可能會需要的一些資源。

  rates_total:當前累計有多少個bar

  prev_calculated:上一次處理到第幾個bar

  time:當前bar的時間

  open:bar開盤價

  high:bar最高價

  low:bar最低價

  close:bar收盤價

  那么整個運行邏輯是怎樣的呢?

  1)第一次觸發OnCalculate()時,其實是處理歷史數據,比如1000個bar,那么rates_total=1000。但是prev_calculated=0,因為還沒有處理過數據。需要注意歷史數據就觸發一次,后面再觸發就是最新數據了。

  2)第二次觸發OnCalculate()時,我們曉得是收到最新數據了,rates_total=1001,而prev_calculated=1000。

  3)如果你覺得第三次觸發時,是收到新的bar,那你就太天真了,第三次觸發時rates_total=1001,而prev_calculated=1001。這是為什么呢?因為一個bar是會多次觸發OnCalculate()的。比如你的K線周期設置為1分鍾,那么一個bar的成型可能需要十次或數十次數據更新,因為最新價是一直在變得啊,所以觸發OnCalculate()大概率是bar的最新價更新了,不一定是有了新的bar。

四、代碼的基本結構

  1)歷史數據和即時數據的區分處理

  綜合前面的說明,我們需要建立一個基本結構,分別來處理歷史數據和最新數據。官方自帶的示例呢就有點復雜,讓人看不明白,這里我就用非常簡單的辦法來判斷歷史數據和最新數據。

 

  有了基本代碼結構,下面就該處理數據了,但是在處理數據前還有個問題要解決,那就是怎么繪制指標線和買賣信號。

  2)指標線和買賣信號繪制

  在MT4繪制指標和買賣信號是一回事,只是顯示方式不同。完成這個過程需要做四步工作:

  第一步:聲明當前存在的指標線和買賣信號。需要注意指標線是line,而買賣信號是arrow

 

  第二步:聲明數據緩存容器

 

  第三步:為容器分配buffer,注意順序,其次這里還對買入和賣出的arrow類型做了指定

   第四步:向對應的buffer中存入數值即可繪制指標線和買賣箭頭,這一步在后面操作。

  3)中間數據的緩存

  在指標的計算中,往往還存在中間數據的保存,在MT4里面如果不曉得這個小技巧的話,中間數據存取會很讓人崩潰(親身經歷)。

 

  增加存數據的buffer

 

 

 

   分配內存,要注意buffer的數量由4變為6

 

 

四、處理歷史數據

  邏輯是簡單的:

  1)從high中取30個周期內的最大值做為highest

  2)在highest的基礎上求MA5

  3)從low中取30個周期內的最小值作為lowest

  4)在lowest的基礎上求MA5

  5)close上穿lowest的MA5則做多,下穿highest的MA5做空

  6)所以將lowest的MA5稱為支撐線,highest的MA5稱為壓力線

  代碼不多:

 

   這里需要注意的就是,在MT4中,數據在數組中是反着放的,比如現在有1000個數據,最新數據是close[0],而不是close[999]。所以你看到我這里處理歷史數據是反序處理的,同時功能函數也都是反序處理的。

  那么可否轉成正序呢,是可以的,有個自帶的函數可以做,不過因為我在發現這個函數前就把功能函數都做好了,也懶得改了。

五、處理即時數據

  直接上代碼。可以看到即時數據處理跟歷史數據是一樣的,只是將i全部改成了0。

 

六、回顧

  在寫MT4指標時,最痛苦莫過於所有數據在數組里都是反序的,折騰了好久才明白。結果很快又發現一個函數可以把反序轉成正序,痛苦啊。

  然后你可能會注意到,這里使用數組是不需要按順序添加數據,甚至還可以間隔着填數據進去。這是咋回事呢?我也不知道,可能為了方便使用吧,結果我一開始按C語言那樣使用動態數組來存儲中間數據,可把我折騰了半天。

  MT4在外匯領域稱霸很年了,我感覺該有一款用python編程的國產平台來取代它才對。

  文中代碼可以關注公眾號“零基礎愛學習”回復“MT2”獲取。

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM