第十一節 創建對象
本節課將告訴大家如何創建對象,所謂創建對象,就是在圖表上加一些東西,比如說線、按鈕、圖標等等。在面板的編寫中這一塊是基礎的內容。
畫線
有的時候我們需要在圖表上畫支撐位、阻力位還有趨勢通道,通過MT4我們可以很簡單地指定兩個點畫出一條線。但是我們用程序來畫的話就有點麻煩,而且很多人覺得用程序來做支撐位和阻力位的分析是比較困難的,因為支撐位和阻力位一般是通過視覺感官來識別的,比如說三角形態的上軌和下軌,這要在EA中實現將會非常複雜,所以很多人覺得畫線功能在EA中基本沒有多大用處。
但是有些策略還是可以做到定義支撐位和阻力位的功能的,比如說Pivot Point策略,比如R-Breaker策略,都是基於之前的價格來計算支撐位和阻力位分析的,當計算得出了支撐位阻力位之後我們就可以畫線了。所以為什麼要學習畫線,我覺得這個應該算是一個儲備,萬一以後碰到這一類計算支撐位阻力位的策略,我們就可以用得上。
講了這麼多,只是為了讓大家不要輕視畫線的學習,下面我們以腳本為例說明如何用程序實現畫線功能。
我們採用ObjectCreat()函數來創建對象,打開幫助文件看一下這個函數如何使用。
如上圖所示,可以看到ObjectCreat()函數需要輸入的參數有圖表的ID、對象名稱、對像類型、窗口編號、點的時間、點的價格這幾個參數。其中,圖表的ID上節課已經講過了,一般情況下我們畫線就畫在當前圖表上,所以一般取0;對象名稱可以隨便設置,但是建議有規律地設置,方便後面修改線條參數;對像類型有很多種,比如垂線、水平線、斜線、通道線、斐波那契回調線、按鈕、文本等等;窗口的編號指的是主窗口還是其他的指標窗口,如果是主窗口的話那就是0;點的時間和點的價格共同描述了K線圖表上的一個點,ObjectCreat()函數創建不同的對象需要的點的數量是不一樣的,比如創建垂線和水平線,就只要一個點,而創建斜線就需要兩個點的數據,所以這個函數可以接收多個點的數據。
下面我們試一下創建一條垂線和一條水平線,代碼如下:
void OnStart() { datetime time=iTime(Symbol(),PERIOD_CURRENT,1); double price=iHigh(Symbol(),PERIOD_CURRENT,1); ObjectCreate(0,"Vertical Line",OBJ_VLINE,0,time,price); ObjectCreate(0,"Horizontal Line",OBJ_HLINE,0,time,price); }
以上代碼將當前圖表的上根K線的時間賦給了time,最高價賦給了Price,然後我們用在上根K線畫了一根垂線,在上根K線的最高價畫了一根水平線。運行代碼後圖表如下,可以看到我們成功畫出了這兩根線。
但是這兩條線的顏色是紅色的,而且是實線,那麼有沒有辦法把線條改成其他顏色,把實線改成虛線呢?
這個時候我們就要通過ObjectSetInteger()、ObjectSetIDouble()以及ObjectSetIString()來修改線條的參數了。怎麼樣,這三個函數是不是很眼熟,還記得上節課我們講過的ChartSet那三個函數麼?其實MT4裡面需要設置和提取參數的函數一般都有三個函數,分別對應整數型的參數修改、小數型的參數修改以及字符串類型的參數修改,所以知道了一個怎麼用,其他的也差不了太多。這三個函數我們也可以參照幫助文件來學習。下面以ObjectSetInteger()函數為例,介紹一下如何使用這一類的函數。打開幫助文件:
可以看到這個函數需要輸入四個參數,對於斐波那契和安德魯魚叉這樣的對象,有五個參數需要設置。
第一個參數是圖表的ID號;第二個參數是對象的名稱;第三個參數是修改的參數的ID;第四個參數是修改後的數值。
現在我們把這兩根線改成虛線,顏色改成綠色,代碼如下:
void OnStart() { ObjectSetInteger(0,"Vertical Line",OBJPROP_COLOR,clrGreen); ObjectSetInteger(0,"Vertical Line",OBJPROP_STYLE,STYLE_DASH); ObjectSetInteger(0,"Horizontal Line",OBJPROP_COLOR,clrGreen); ObjectSetInteger(0,"Horizontal Line",OBJPROP_STYLE,STYLE_DASH); }
代碼稍微知道一點英語的應該都能看得懂。 OBJ是Object,也就是對象的縮寫,PROP是Property的縮寫,參數的意思,OBJPROP_COLOR,就是對象的顏色參數,clr是color的縮寫,clrGreen就是顏色是綠色,那麼第一句的意思就是把名字為” Vertical Line”的對象的顏色設置成綠色。其他的語句也可按此方法來解讀。
運行腳本,我們畫出的兩條線就變成了下圖的形式,可以看到我們的代碼起作用了。
當然,線條的參數還不止這兩個,比如說線條的寬度也可以設置,比如說可以把線條的圖層放到K線下面等等,以上的參數就不一一舉例了,大家可以在幫助文件中找一下對應的參數修改方式。
按鈕
在做面板的時候我們會經常用到按鈕來幫我們快速完成某一個功能,一如說做一個開倉按鈕和平倉按鈕,這個時候我們就需要新建一個按鈕對象。
對於對象,採用的都是ObjectCreat()函數來新建,按鈕對象和畫線對象輸入的參數也差不多,我們建一個試一下,代碼如下:
void OnStart() { ObjectCreate(0,"button",OBJ_BUTTON,0,0,0); }
很簡單,就一句話就能新建一個按鈕了,我們運行代碼,可以看到我們的圖標上多出了一個按鈕:
現在我們想把它裡面的文字改一下,改成”Buy”,把大小也修改一下,然後把位置也改一下,很簡單,用上面的ObjectSet類函數就行,代碼如下:
void OnStart() { ObjectCreate(0,"button",OBJ_BUTTON,0,0,0);/*创建按钮对象*/ ObjectSetInteger(0,"button",OBJPROP_BORDER_COLOR,clrBlue); /*设置边框颜色*/ ObjectSetInteger(0,"button",OBJPROP_XSIZE,100); /*设置按钮宽度*/ ObjectSetInteger(0,"button",OBJPROP_YSIZE,50); /*设置按钮高度*/ ObjectSetInteger(0,"button",OBJPROP_COLOR,clrWhite); /*设置按钮文字颜色*/ ObjectSetInteger(0,"button",OBJPROP_BGCOLOR,clrBlue); /*设置按钮填充颜色*/ ObjectSetInteger(0,"button",OBJPROP_FONTSIZE,15); /*设置按钮文字大小*/ ObjectSetInteger(0,"button",OBJPROP_CORNER,CORNER_RIGHT_UPPER); /*以右上角作为按钮定位的参考点*/ ObjectSetInteger(0,"button",OBJPROP_XDISTANCE,110); /*设置按钮的左上角与参考点的 水平距离*/ ObjectSetInteger(0,"button",OBJPROP_YDISTANCE,10); /*设置按钮的左上角与参考点的 垂直距离*/ ObjectSetString(0,"button",OBJPROP_TEXT,"Buy");/*设置按钮内的文本为”Buy”*/ }
我們運行程序,可以看到按鈕變成了藍色,文字成了白色,大小也變了,位置到了圖表的右上角上,如下圖:
這裡需要說一下按鈕位置的設置,我們在程序中用語句把右上角作為了按鈕定位的參考點,然後我們設置了按鈕的大小,我們設置的X方向的大小為100,那麼為了讓這個按鈕的右邊和圖表的右邊界保持10的距離,我們設置的左上角和圖表右上角的距離應該是100+10,也就是XDISTANCE應該設置成110,如果我們把XDISTANCE直接設置成10的話,那麼按鈕就顯示不全了,如下圖。所以在設置的時候我們一定要注意這一點。
那麼我們按一下按鈕,它確實陷進去了,但是沒有什麼反應,那如何在我按下這個鍵之後讓它下一個買單呢?我們按下這個按鈕其實是一個圖表事件,那麼結合之前講的OnChartEvent()函數了,我們就能做出相應的功能了,下面我們來試試。記得之前講過OnChartEvent()函數只能在指標或者EA裡面使用,所以下面採用EA來示例,代碼如下:
void OnInit () { ObjectCreate(0,"button",OBJ_BUTTON,0,0,0);/*创建按钮对象*/ ObjectSetInteger(0,"button",OBJPROP_BORDER_COLOR,clrBlue); /*设置边框颜色*/ ObjectSetInteger(0,"button",OBJPROP_XSIZE,100); /*设置按钮宽度*/ ObjectSetInteger(0,"button",OBJPROP_YSIZE,50); /*设置按钮高度*/ ObjectSetInteger(0,"button",OBJPROP_COLOR,clrWhite); /*设置按钮文字颜色*/ ObjectSetInteger(0,"button",OBJPROP_BGCOLOR,clrBlue); /*设置按钮填充颜色*/ ObjectSetInteger(0,"button",OBJPROP_FONTSIZE,15); /*设置按钮文字大小*/ ObjectSetInteger(0,"button",OBJPROP_CORNER,CORNER_RIGHT_UPPER); /*以右上角作为按钮定位的参考点*/ ObjectSetInteger(0,"button",OBJPROP_XDISTANCE,110); /*设置按钮的左上角与参考点的 水平距离*/ ObjectSetInteger(0,"button",OBJPROP_YDISTANCE,10); /*设置按钮的左上角与参考点的 垂直距离*/ ObjectSetString(0,"button",OBJPROP_TEXT,"Buy");/*设置按钮内的文本为”Buy”*/ } void OnDeinit (const int reason) { ObjectDelete(0,"button"); } void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { if(id== CHARTEVENT_OBJECT_CLICK && sparam=="button") { Print("Buy an Order"); } }
以上代碼中,我們在OnInit()函數里面創建出了按鈕,在OnDeinit()函數里面刪除對象,也就是說只要加載EA,EA初始化的時候就會把按鈕創建出來,當我們退出EA時,EA就會自動把按鈕刪掉。然後在OnChartEvent()函數中,我們通過if函數識別了鼠標點擊對象事件,如果鼠標點擊的是名字為”button”的對象,那麼我們就打印輸出”Buy an Order”。這裡由於編課的時間在周末,所以無法交易,就用輸出” Buy an Order”這句話來檢驗我們的程序是不是有用,後面換成買單的命令也很容易,大家可以自己試一下。
程序很簡單,我們運行試一下,加載EA後可以看到程序和之前一樣在圖表右上角自動創建了一個按鈕,我們點擊一下按鈕,可以看到程序輸出如下圖,輸出了” Buy an Order”,所以運行沒有問題。
文本框
那有人說上面的下單按鈕沒辦法調整手數哇。確實是這樣,那麼就需要文本框對象來彌補按鈕對象的不足了。
同樣,我們用ObjectCreat()函數來創建文本對象,腳本的代碼如下:
void OnStart() { ObjectCreate(0,"button",OBJ_BUTTON,0,0,0);/*创建按钮对象*/ ObjectSetInteger(0,"button",OBJPROP_BORDER_COLOR,clrBlue); /*设置边框颜色*/ ObjectSetInteger(0,"button",OBJPROP_XSIZE,100); /*设置按钮宽度*/ ObjectSetInteger(0,"button",OBJPROP_YSIZE,50); /*设置按钮高度*/ ObjectSetInteger(0,"button",OBJPROP_COLOR,clrWhite); /*设置按钮文字颜色*/ ObjectSetInteger(0,"button",OBJPROP_BGCOLOR,clrBlue); /*设置按钮填充颜色*/ ObjectSetInteger(0,"button",OBJPROP_FONTSIZE,15); /*设置按钮文字大小*/ ObjectSetInteger(0,"button",OBJPROP_CORNER,CORNER_RIGHT_UPPER); /*以右上角作为按钮定位的参考点*/ ObjectSetInteger(0,"button",OBJPROP_XDISTANCE,110); /*设置按钮的左上角与参考点的 水平距离*/ ObjectSetInteger(0,"button",OBJPROP_YDISTANCE,10); /*设置按钮的左上角与参考点的 垂直距离*/ ObjectSetString(0,"button",OBJPROP_TEXT,"Buy");/*设置按钮内的文本为”Buy”*/ ObjectCreate(0,"TEXT",OBJ_EDIT,0,0,0); /*创建文本框对象*/ ObjectSetInteger(0,"TEXT",OBJPROP_BORDER_COLOR,clrGray); /*设置边框颜色*/ ObjectSetInteger(0,"TEXT",OBJPROP_XSIZE,100); /*设置文本框宽度*/ ObjectSetInteger(0,"TEXT",OBJPROP_YSIZE,50); /*设置文本框高度*/ ObjectSetInteger(0,"TEXT",OBJPROP_COLOR,clrWhite); /*设置文本框文字颜色*/ ObjectSetInteger(0,"TEXT",OBJPROP_BGCOLOR,clrGray); /*设置文本框填充颜色*/ ObjectSetInteger(0,"TEXT",OBJPROP_FONTSIZE,15); /*设置文本框文字大小*/ ObjectSetInteger(0,"TEXT",OBJPROP_CORNER,CORNER_RIGHT_UPPER); /*以右上角作为文本框定位的参考点*/ ObjectSetInteger(0,"TEXT",OBJPROP_XDISTANCE,210); /*设置文本框的左上角与参考点的 水平距离*/ ObjectSetInteger(0,"TEXT",OBJPROP_YDISTANCE,10); /*设置文本框的左上角与参考点的垂直距离*/ ObjectSetInteger(0,"TEXT",OBJPROP_ALIGN,ALIGN_CENTER); /*设置文本的水平对齐方式为水平居中*/ ObjectSetInteger(0,"TEXT",OBJPROP_READONLY,false); /*禁用文本框的只读模式*/ ObjectSetString(0,"TEXT",OBJPROP_TEXT,"0.01");/*设置文本框的默认内容*/ }
以上程序中我們建立了一個文本框,可以注意到文本框的設置和按鈕的設置除了禁用只讀模式以及需要再設置一下水平對齊的方式外,其他基本沒有太大區別。運行程序,圖表右上角多出了一個文本框,如圖:
我們手動修改一下數字,如圖,看來程序運行沒有問題,文本可以編輯。
以上內容介紹了幾種對象的創建和設置方式,當然,MT4中不止這幾種對象,包括趨勢通道、斐波那契回調線、安德魯魚叉線等等都屬於對象,它們的設置也大同小異,都是用設置函數來做,這些就不講了,如果以後用得到的話大家只要記得這些東西屬於對象,然後打開幫助文件找一下用法就行。
那麼接下來下節課我們就利用本節課所學的東西來寫一個有點用的輔助EA面板,大家好好掌握這節課的內容,多加練習。