1、完美實例講解EasyLanguage,由TS發燒友根據多年學習經驗總結編輯的實例講解教程,由淺入深,講解說明簡單易懂,並且融入了實戰的寶貴經驗竅決等,是難得的寶貴學習教程。 教程共分四大部分。 第一部第一章:指標寫作 Know How EasyLanguage PowerEditor 簡介 OmegaResearch TradeStation 系列產品是交易者公認最好用的交易工具整合環境。你不只可以拿它來看盤,使用它內建的諸多技術指標協助分析交易,你也可以自行開發屬意的指標,只要你想的到的。最重要的你可以用它來開發交易系統協助你進入機械化交易的世界。把交易構想付之實現並量化,
2、你可以給自己交易最重要的東西──信心! 這個開發並實現交易夢想的核心就存在它內含的EasyLanguage PowerEditor當中。它不是一般點選內建指標,再加一些邏輯運算選項的陽春交易系統設計平台。它是透過一個類似Pascal語法的所謂EasyLanguage來書寫你的程式碼,然後透過內部的編譯器產生執行效率高的機碼(這就是讓它屹立不搖的賣點)。甚至連它的競爭者如Equis 的 MetaStock 等多年來也只能不敢吭聲的當老二。 雖然它名為「容易語言」,可是對許多沒有程式語言經驗的人來說它還真是宛如火星語一般的叫人直呼「不容易」。特別對我們這些非英語系的地區又多一曾障礙可稱
3、為最高級的「真不容易」。你的英語能力我沒辦法幫你改善的,至於EasyLanguage我可以助你一臂之力!不過你的電腦概念我也無能為力,基本上你還是要靠你自修加強,如果還是拿過去的理由讓自己逃避,那省點事就乾脆不要交易了吧!因為你放棄的是一條通往成功交易的不二法門,那就「學海無涯、回頭是岸」吧。 以下所附的幾則程式碼是未來全文所拿來探討的樣本,你可以節錄列以便對照文章內的解說達事半功倍之效。對了、這些程式你都可以在你的PowerEditor找到,因為這些都是TS2000i所內建的。 MACD指標: {*******************************************
4、 Description : This Indicator plots MACD Provided By : Omega Research, Inc. (c) Copyright 1999 ********************************************************************} Inputs: FastMA(12), SlowMA(26), MacdMA(9); Plot1(MACD(Close, FastMA, SlowMA), "MACD"); Plot2(XAver
5、age(MACD(Close, FastMA, SlowMA), MacdMA), "MACDAvg"); Plot3(Plot1 - Plot2, "MADiff"); {Alert Criteria} If Plot3 Crosses Over 0 Then Alert("MACD has generated a bullish alert") Else If Plot3 crosses under 0 Then Alert("MACD has generated a bearish alert"); {MACD Expert Com
6、mentary} #BeginCmtry Commentary(ExpertMACD(Plot1)); #End; MACD函數之1: {******************************************************************* Description: Moving Average Convergence Divergence Provided By: Omega Research, Inc. (c) Copyright 1999 **********************************************
7、} Inputs: Price(NumericSeries), FastMA(NumericSimple), SlowMA(NumericSimple); MACD = XAverage(Price, FastMA) - XAverage(Price, SlowMA); MACD函數之2 {******************************************************************* Description: Exponential Average Provided By: Omega Resear
8、ch, Inc. (c) Copyright 1999 ********************************************************************} Inputs: Price(NumericSeries), Length(NumericSimple); Variables: Factor(0); If Length + 1 <> 0 Then Begin If CurrentBar <= 1 Then Begin Factor = 2 / (Length + 1); XAverage =
9、 Price; End Else XAverage = Factor * Price + (1 - Factor) * XAverage[1]; End; MACD多頭交易訊號 {******************************************************************* Description : MACD Long Entry Provided By : Omega Research, Inc. (c) Copyright 1999 ************************
10、} Inputs: FastMovAvg(12), SlowMovAvg(26), MACDMovAvg(9); Variables: XMACD(0); If CurrentBar > 2 AND MACD(Close, FastMovAvg, SlowMovAvg) Crosses Above XAverage(MACD(Close, FastMovAvg, SlowMovAvg), MACDMovAvg)[1] Then Buy ("MACD") This Bar on Close;
11、 MACD空頭交易訊號 {******************************************************************* Description : MACD Short Entry Provided By : Omega Research, Inc. (c) Copyright 1999 ********************************************************************} Inputs: FastMovAvg(12), SlowMovAvg(26), MACDMovAvg(9)
12、 If CurrentBar > 2 AND MACD(Close, FastMovAvg, SlowMovAvg) Crosses Below XAverage(MACD(Close, FastMovAvg, SlowMovAvg), MACDMovAvg)[1] Then Sell ("MACD") This Bar on Close; 待續 第一章:指標寫作 現在開始我會逐行解說每一行程式碼的意義。我不想用一般手冊的說明方法,因為那樣子讓我覺得沒有效率;它讓你懂一些方法,卻也讓你閤上書後忘的一乾二淨。我讓你在實做中學習,馬上披掛上陣!有成就感你就不
13、容易忘。然後我會舉一反三拿一些實例加強你的觀念進入深植,想忘都不可能!至於手冊、我希望你不要丟掉它,放在身邊你會常常用它的;愛因斯坦說:不要去背找得到的資料來增加大腦的負擔。相信我!我這二十多年涉獵許多電腦語言,沒有手冊我一行碼都掰不出來的。讓我們繫上安全帶,飛上天HI一下! MACD指標: Indicator?什麼是Indicator?它就是指標、技術指標。不過在TS2000i它更泛指「可以顯示在圖型工作區的指標」,也就是說它不只是包含計算指標部份,更包括了顯示部份(畫圖PLOT)。以下就是一個完整的MACD指標程式,使用EasyLanguage語法完成的。 {*
14、 Description : This Indicator plots MACD Provided By : Omega Research, Inc. (c) Copyright 1999 ********************************************************************} 這一段我們稱為『備註』、『註解』(Remark)。在PowerEditor中它會顯示為綠色,因為它不會被
15、理會或被編譯,但它方便我們閱讀,知道自己在這段程式企圖得到或想表現些什麼。 註解被包圍在大括符裡頭{}。只要你把一段文字用大括符包圍起來,就是告訴PowerEditor不要去執行這段東西,就算它裡面是計算式也不必去鳥它。因為它是寫給我這有血有肉的人看的,不是給你這大腦裝滿海沙的傢伙看的。 Inputs: FastMA(12), SlowMA(26), MacdMA(9); Inputs : 『外來參數輸入』。 文法 Inputs 加冒號『:』之後輸入外來參數『FastMA』後加括符內填初設值『(12)』。如果有一個以上的參數需要被代入,參數間用逗點隔開『,』
16、最後結束時以分號終止『;』。 Inputs的部份是代表這些數據未來在我們使用該指標時是可以被更改的。如本例可以看到12,26,9就是一般MACD的慣用參數。特別說明的是當我們在設定參數名稱(FastMA)時雖然沒人管你要命什麼名稱,但設定一些可讀性高的名稱對你未來使用會是一件好事的。FastMA一條快速的移動平均線比用abc來的叫人會意些吧? 初值一般也引用常用數據來代入,如此在使用上你也會方便自己許多。為什麼我們要設外來參數呢?因為它方便你在使用時迅速的更改配合當時需要。也許你有天想看看以6,13,5計算的MACD會長得如何?那好你直接在圖形頁改參數便可。如果你不用Inp
17、uts、那抱歉你只有再進入PowerEditor改新參數,然後重新編譯一次才可以使用,當然你要是每到陰天閒的發慌我不阻止你如此幹,至少你孩子會對我感激涕零。 Plot1(MACD(Close, FastMA, SlowMA), "MACD"); Plot1 呼叫Plot1函式(函式未來會提,現在你就當自己是皇上吆喝各司其職的小太監上場。有侍衣、侍食、侍寢、、之類的他們有自己的專屬工作,只待你一聲令下,只是你要叫對人)。函式後面緊跟括符『()』,同樣以分號結束敘述。括符內加入函式本身需要的參數或變數。加什麼呢?這時手冊就派上用場了!每一個函式要加的參數是不一定的,所以手冊會
18、幫你找到。你也可以利用線上手冊,點選右上像一本書的圖示或是選單的Tools>EasyLanguage Dictionary。 文法Plot1(代入要顯示的數據,”顯示的文字字串”);同樣的各參數間以逗點相隔,以分號結束。這裡有一個不同;字串輸入必須包含在“”之間。它藉以區隔特別是數字以文字不被處理而直接表現。比如說”3-2”會表現3-2而不是變成1。 Plot1它有許多兄弟姊姊,排行由1到4。為什麼呢?因為TS200i設計成每個指標的顯示個數最大為4,無法顯示更多。對了這四條線的當然包括你喜歡加在如RSI的超買或超賣的水平線,珍惜物資喔。 這例子中第一個代入
19、的數值變數,我們的MACD數據由另一個函式完成運算。也就是說函式之中另有函式!其實不用大驚小怪,在程式語言這是很正常的事。你叫來服侍你吃飯的小太監當然需要再找御膳房的小太監幫你張羅,不是這樣嗎? MACD()這個函式需要輸入三個參數。後兩個是我們提過的外部輸入的天數參數,就是算12天平滑平均減26天平滑平均。那用什麼來算呢?『收盤價』不是嗎?所以第一個參數我們置入Close。在EasyLanguage中Open、High、Low、Close、IF、THEN等被稱為保留字(Reserved Word),也就是說這些字被定義為具專門用途的用語,其意義被永久固定無法更改或被指定他用。不要
20、懷疑這裡的他就是指你!所以在此這個Close就是代表收盤價,無論你在任一程序中發現它都是那個意思。 待續 Plot2(XAverage(MACD(Close, FastMA, SlowMA), MacdMA), "MACDAvg"); Plot2自然是要畫第二條線,所以不再解釋Plot用法。這裡特別的是再加入一名採買食物的小太監XAverage()。它是『平滑係數平均值』的計算函式,代入兩個參數,第一數據是被運算的基數如同剛才的Close。是呀!如果你是寫XAverage(Close,9); 就是要計算9天的收盤平滑係數平均數(EMA)了。這裡因為我們要計算MACD指標
21、所以我們必須把計算結果的MACD再做一條它的9天平均。所以、我們第一個參數代入Plot1相同的函式求出MACD。第二參數就代入外部參數的MacdMA,它的意義就是9天。咦?我剛才說溜嘴提到跟Plot1相同這句話嗎?隱藏多年的秘密竟然、、好吧!其實你的身世是、、、喔這不是秘密啦?你都知道了?好吧既然移不開話題我只好坦白啦!你也可以這麼寫。 Plot2(XAverage(Plot1, MacdMA), "MACDAvg"); 這個意義是一樣的。因為現在Plot1的數據就是代表MACD的運算結果。你可以嘗試改寫,將發現輸出結果並沒有改變。不信?那往下看! Plo
22、t3(Plot1 - Plot2, "MADiff"); Plot3看到了吧?我沒騙你吧!這裡是在表示我們MACD的『柱狀圖』部份。柱狀圖便是MACD減去MACD平均的差值,表現這兩數據的差離、乖離(OffSet)。所以我們直接精簡表示為Plot1 – Plot2。 好!討論到此這個指標的核心已經結束。其他的程式碼是指標附加功能,我也會解釋。只是到此你應該有利用現成函式自己寫個指標亮相的能力了。所以我想在此先談一些運用變化,讓你舉一反三增加幾個甲子的功力。 讓我們來嘗試用不同的方式改寫這個指標。行動前我再解釋一個重要的部份,就是除外部參數外我們還必須瞭解
23、及學會運用內部參數或變數的運用。內部參數文法如同Inputs,只不過它不用Inputs是用Vars。例 Vars : Macd_Now(0),Macd_Xavg(0),Macd_Diff(0); 是不是差不多?我們一般會給變數初值為零,算是一個重置(ReSet)的動作。當然你如有特殊需要是可以直接代入需要的數據不一定設為零。上點BCC電腦基本概念;Vars就是我們向電腦要求分配一個記憶區供我們置放一些運算結果。就像我們跟電腦要一張椅子,我拿椅子當比方就是它是張單人椅,請不要嘗試跟你的阿那答想親蜜的擠一張椅子。所以啦、椅子永遠是要到的那一張,坐的人可以是任何一個人。以下
24、例子說明內部變數使用文法。 Vars : Macd_Now(0); Macd_Now = 3.14 < 正確的代入,椅子正被3.14所坐。 3.14 = Macd_Now < 錯誤!3.14正被椅子坐? Macd_Now = Macd_Now + 2000 < 正確!Macd_Now增肥2000公斤後變了另一個傢伙,雖然他媽媽都認不出他了,他還是有資格坐在椅子上。 這樣瞭解變數的運算了吧?現在我就來改寫MACD的指標。點選File>New>General下選Indicator產生一個空白的指標公式書寫頁。Create a New Indicator視
25、窗下輸入指標名稱(Name)『My_MACD』,Short_Name可不要或輸入簡短的花名如『Nmacd』。Note嘛、就自己心情舒發啦,像是僅將此程式獻給我的小花之類的。就是說嘛!第一次寫TS2000i的指標耶! 改寫MACD指標: {******************************************************************* Description : This Indicator plots MACD Provided By : Omega Research, Inc. (c) Copyright 1999 *****
26、} Inputs: FastMA(12), SlowMA(26), MacdMA(9); Vars : Macd_Now(0),Macd_Xavg(0),Macd_Diff(0); Macd_Now = MACD(Close, FastMA, SlowMA); Macd_Xavg = XAverage(Macd_Now, MacdMA); Macd_Diff = Macd_Now – Macd_Xavg; Plot1(Macd_N
27、ow, "MACD"); Plot2(Macd_Xavg, "MACDAvg"); Plot3(Macd_Diff, "MADiff"); Plot4(0,”0”); 如何?是不是一樣的東西?我們甚至用了第四條線來畫零軸中線。最後你必須按『F3』進行,記住!所有新寫或改寫的程式都必須按一下F3讓PowerEditor幫你檢視並編譯才可以使用。當回應你Excellent!你就可拍拍手鼓鼓掌,因為它簽了通行證給你。快去TS2000i打開一張圖然後按F7看看Indicator有沒有你的大作出現?找到My_MACD點選有沒有熱淚盈眶呀? 不過打擊接踵來到。你的柱
28、狀圖為啥跟MACD一樣是條線呢?嗯、再回到我們的PowerEditor點選File>Properties在Indicator Properties – My_MACD 視窗下選Chart Style > Plots > MADiff > Type > Histogram。記得改完按確定後還是要按F3再編譯一次。自己可以嘗試看看如何把零軸改成點狀的線段表示。 待續 接下來、我們再舉一個例子寫另一個通用指標Stochastic,就是我們慣稱的KD指標。我們設定通用天數為9天,我們知道必須要運算RSV(不成熟隨機值)、與得到9天範圍的最高與最低。完成程式如下 Inputs: Le
29、ngth(9), OverSold(20), OverBought(80); Vars : RnHi(0),RnLo(0),RSV(0),sK(0),sD(0); If CurrentBar > 1 then begin RnHi = Highest(High, Length); RnLo = Lowest(Low, Length); RSV = (Close - RnLo) / (RnHi - RnLo) * 100; sK = ((sK[1]/3) * 2) + (RSV / 3); sD = ((sD[1]/3)
30、 2) + (sK / 3); end; Plot1(sK, "%K"); Plot2(sD, "%D"); Plot3(OverBought, "OverBought"); Plot4(OverSold, "OverSold"); 以上程式碼大致應該沒問題,不需再逐行解說了。所以我挑重點說明。這裡出現一個新東西,我們第一個接觸的『判別式』;IF(邏輯判斷)THEN(執行)。我們把這個運算譯成白話就是:如果(IF)今天下雨?(事實判斷)那麼(THEN)我們出門就要打傘(行動)。寫成程式為: IF 今天下雨? THEN 我們出門就要打傘;
31、 在『今天下雨?』這個條件判別將產生『真TRUE』或『偽FALSE』的結果,如果結果為真(TRUE),我們則執行隨後要求的動作,如偽(FALSE)隨後動作將不會被執行。再看以下例子: My_Count = 12; IF My_Count > 10 THEN My_Count = My_Count + 10; (TRUE>執行) IF My_Count < 10 THEN My_Count = My_Count / 100; (FALSE>不被執行) 再插個花談談EasyLanguage『運算元』!在四則運算沒有什麼問題,順序也依習慣做先乘除後加減
32、在『條件式』寫法中可用邏輯運算元連接幾個條件判斷;如AND、OR等。特別的是大於或等於寫成>=,不可以寫=>。 拉回來再談下去。如果THEN之後我們要執行的不只是擔一步驟,那要如何解決?難道我們要一條一個IF~THEN的寫下去?當然不必如此!我們用一個方式來告訴它執行某範圍的動作,我們用BEGIN跟END來界定多個動作。 IF 今天下雨? THEN BEGIN 我們出門就要打傘; 出門前提醒家人外出也要帶傘; 檢查家裡的窗戶關了沒; END; 上面的條件判斷後將執行三個動作。當然你還可以在IF-THEN中再加入另一個IF-THEN,形成所謂
33、的『巢狀判別式』,往後碰到例子再加強說明吧。除上面談的IF-THEN之外我們又看到幾個常用函式,介紹一下用法! CurrentBar是一個常常會呼叫的函式,不過它不必引入參數,它回傳的是一個數字,這數字跟你計算指標的起始有效日數有關。在此例中、我們在資料開始的第9天後才能開始計算出KD的值,所以CurrentBar回傳為1時就是第9天。所以我們在第9天之後開始計算KD(CurrentBar > 1),如此你就不會在第9天之前看到亂七八糟的指標數據了。 Highest(比較數據, 範圍天數)。這個函式很容易瞭解因為它用High+Est。這裡的High不是指我們説的當日最
34、高,而是一堆數據裡的最高值將被發現出來。所以我們如果輸入Highest(Close, 9);將會尋找出過去9天中最高的收盤價。而相對的Lowest()便是找出輸入範圍的最低值。 最後一個是sK與sK[1]、sD與sD[1]。其中的不同點在於後面加了一個中括符。在EasyLanguage中,我們用中括符[X]來表示取前X天的數據或資料。所以當我們運算%K的時候需要昨天的%K數據,所以我們代入sK[1]就是得到1天前的%K數據。同理sD[1]也是這個意思。這個符號使用範圍很廣,幾乎所有的變數都可以使用如此的表示。如Close[10]表10天前的收盤價、High[6]表6天前的當日最高值
35、好囉這段程式到現在應該沒有感覺陌生的語法了吧?老寫原來已經有的指標是否有點少些新鮮感?我們在繼續推進前最後再舉一個例子;它是在寰宇財金[45]-『最新技術分析指標』中的【隨機RSI擺盪指標--P133】。 Name : StochRSI Inputs : Price(close), Length(9); Vars : ToRSI(0), HiRSI(0), LoRSI(0); ToRSI = RSI(Price, Length); HiRSI = Highest(ToRSI, Length); LoRSI = Lowest(ToRSI, Length)
36、 Value1 = (ToRSI - LoRSI) / (HiRSI - LoRSI); Value2 = .8; Value3 = .2; Plot1(value1, "StRSI"); Plot2(value2, "O.B"); Plot3(value3, "O.S"); 依慣例介紹個新朋友。『Value1』是EasyLanguage裡一個貼心的變數設定。還記得我們要使用變數前都必須在Vars : 後先『宣告變數使用』的動作。不然編譯器在你按F3時會給你錯誤訊息,非法使用變數一類的。不過這個Value1不必經過這道手續,它是例外的;
37、EasyLanguage留下Value1~Value999給你「濫用」。為什麼說濫用呢?就是它雖然使用方便,但會養成你寫程式的壞習慣,降低你的程式可讀性。像這幾行完成的程式當然無妨,如果你未來寫個老太婆的纏腳布那麼長的程式,而你不停的、快樂的用上ValueX;嘿嘿!你在寫完的半年後想修改個內容你就會吃盡苦頭了,因為你的作品像極了結繩記事,那個長的像肉包子大的結到底是記錄發生的那條大事?它會讓你悔不當初。 接下來繼續談我們的MACD指標後半段。 {Alert Criteria} If Plot3 Crosses Over 0 Then Alert("MACD
38、 has generated a bullish alert") Else If Plot3 crosses under 0 Then Alert("MACD has generated a bearish alert"); 這段是在設定TS2000i發出警訊(Alert)的部份。當條件吻合的時候TS2000i會產生一個浮動視窗給你訊息。還記得Plot3是那個數值嗎?對了它就是MACD的柱狀圖,也就是MACD – MACD的9天平均;也就是我們一般定義空或多的方式。當Plot3穿越零軸(昨天於零下)時我們啟動警訊功能,提示我們行情翻多。這裡
39、我們不用Plot3 > 0 ,因為會產生只要Plot3持續大於零,那你的警報器就會響個不停。我們在此使用Crosses Over(或Crosses Above都為穿越向上)。這個語法會在未來經常用到,它與>判別不同的就是它只在穿越的那一天為『真值TRUE』。那向下穿越便是Crosses Under 或 Crosses Below!如果我們非得用大小於表示的話,那Crosses Over 便可同義於: IF Plot3[1] < 0 and Plot3 > 0 Then 這裡我們看到一個『生字』-『ELSE』解讀為如果不成立的話;它是配合著IF-THEN一起使用的。就
40、是說我們的IF條件式在判讀時,如果不能為真則不會執行後續動作。但如果我們需要在不為真時執行另一個動作,我們便可以使用這ELSE來解決。原先還不認識ELSE前我們可能如此去寫程式: If Plot3 Crosses Over 0 Then Alert("MACD has generated a bullish alert"); If Plot3 Crosses Under 0 Then Alert("MACD has generated a bearish alert") 現在透過ELSE的語法,我們便可以結合上面兩行變成一個完整的敘述,如指標內的寫法。 {MA
41、CD Expert Commentary} #BeginCmtry Commentary(ExpertMACD(Plot1)); #End; 最後一段敘述是在指標中加入一些指標功能解說。它可以方便新手或對你獨創指標不甚瞭解的使用者得到一些使用資訊。#BeginComtry ~ #End; 是說明檔專屬的寫法,所有的說明敘述被包括在這個範圍裡。而Commentary() 函式是輸入說明文字檔的地方,不要忘了文字字串要加“”。在此範例,當中輸入的是另一個函式ExpertMACD(Plot1),它是一個互動的說明文件,可以告訴你點選的MACD代表什麼意義或如何運用
42、當然我們可以如此簡單的去寫說明功能: #BeginCmtry Commentary(“MACD零軸以上為多頭,以下為空頭”); #End; 如此我們在TS2000i中開啟一個圖形,插入(F7)MACD指標。然後我們在上面的功能表中選擇Drawing>Expert Commentray便可發現一個說明的浮動視窗,隨著我們點選不同日期資料說明也會跟著不同;這是比較複雜寫作的TS2000i專家說明互動文件。 對了,有一個事情你應該知道!TS2000i無法處理雙字元的文字;也就是說它看不懂中文,所以我們無法在程式中輸入中文字串,它將會以亂碼呈現。當然這包
43、括了我們所談過的註解或以上的說明運用。 待續 第二章:函式寫作 我進入瞭解EasyLanguage是在TS4的時代,因為在此之前TS的程式寫法還是陽春的、跟MetaStock一樣。不過我的學習進步的很快,我幾乎一夜之間就學會了;因為我有一位好老師。誰呢?就是EasyLanguage PowerEditor本身!它的求助檔提供了方便及迅速的知識支援。最可愛的是它內建的所有程式庫,我拿我熟悉的技術指標開始閱讀學習;於是語法、技巧與函式建立與呼叫一次搞定。 其實電腦的語言世界,跟我們人類的真實世界語言使用是大同小異的。不同語言間有許多的相似點,只要你掌握變數、運算、
44、條件、迴圈、程序與函式等這些使用方法,你便幾乎已經學會該語言技巧。EasyLanguage是一個衍生自Pascal的語言,所以各位學會EasyLanguage在交易的圈子是特別有用的。因為許多知名的交易開發程式它都不約而同的使用類Pascal的語法。比如你再往WealthLab學習時就會瞭解我所説的,當然更是容易學會使用AmiBroker等程式。 在進入主題前提一堆這些事是雞婆,也是希望學習能下點耐心與苦功,相對的學習也是必須花點心讓它Smart點,善用程式提供的資源。很多好程式都提供了求助的現上資源,可是很少看到有人會去使用它。 這一章談的是EasyLanguage一
45、個重要的語法運用-『函式Function』。想像你是個戀MACD癖、使用MACD狂。三餐缺了MACD就食不知味,從指標、PaintBar、ShowMe到交易策略交易系統你都要代入MACD才甘心、才有安全感?那你有沒有想過要寫幾次MACD的基本運算?因為每一個開頭起點你的資源永遠只有開高低收幾個數據,你都要重新算12天、26天的平滑係數平均值,然後相減再做9天平均,對吧?為什麼不讓這些核心運算式獨立成一個部份,然後我們不論何時都可以把它呼叫達到程式書寫簡化的目的?人有錯手嘛、你也沒把握每一次寫的時候都對。這個上面題的獨立成為一個部份就是我們現在要學的函式的使用。 函式裡面包括許多運
46、算,可能是簡單也可能複雜。你可以把它看成一個包含許多運算式的黑盒子(Black Box),它可能有一個以上的輸入端(Inputs)但只能有一個輸出端(Outputs)。記得我們的MACD指標敘述嗎(我改寫過的)? Macd_Now = MACD(Close, FastMA, SlowMA); Macd_Xavg = XAverage(Macd_Now, MacdMA); 上敘中MACD跟XAverage便是函式,我先前談的小太監。以MACD函式來說;括符內的Close,FastMA,SlowMA便是輸入值(Inputs),是提供MACD函式運算的數據。我們在前頭使用一
47、個變數空間(Macd_Now)來接收MACD的計算結果輸出值(Outputs)。函式輸出值在任何程式語言中返回值永遠只能有一個。所以我們不可能只寫一個函式就把MACD與MACD的9天平均一起丟回來,我們必須再使用另一個函式XAverage來幫我們求得9天的MACD均值。有趣的是呆會我們會看到XAverage這個函式可忙的很,它是EasyLanguage的內建通用函式;它的設計目的就是專門運算平滑係數平均值,你說、在MACD全都用平滑係數運算的指標裡,它會不會有夠熱鬧跟忙碌呀? MACD函數之1: {****************************************
48、 Description: Moving Average Convergence Divergence Provided By: Omega Research, Inc. (c) Copyright 1999 ********************************************************************} 對上面這個滿臉發綠的傢伙我就不再解釋了。不錯它就是註解,給人塗鴉寫些到此一遊之類的地方。 Inputs: Price(NumericSeries), FastMA(N
49、umericSimple), SlowMA(NumericSimple); Inputs我們也不再有疑問,就是外部資料輸入的設定,逗點區隔用分號結束敘述。不過函式有一些差異喔,看到NumericSeries?它可不是像指標用法直接輸入數據(Value)而是輸入格式(Format)。函式只宣告未來使用時你只可以給我餵些什麼飼料?不合規格的飼料我才不肯吃進肚子裡。除了NumericSeries(數值序列,就是數字啦!給我“阿花我愛妳”之類的踢!)之外函式也可以宣告輸入格式為TrueFalse(邏輯真偽值)與String(Text文字),輸出值也相同這三類;它在你File>New>Ge
50、neral選Function時出現的視窗便會提示你設定回傳值類別(Return Type),在此我們希望它回傳數值所以勾選Numerric。 MACD = XAverage(Price, FastMA) - XAverage(Price, SlowMA); 我們在MACD函式中只有這可憐的一行就解決了。不過這一行要注意的可也不少喔!首先你會發現等式左邊『MACD』在此為什麼沒有用Vars宣告呢?因為在此的MACD是有特殊意義的,別忘了這個函式名稱就叫做『MACD』!語法規定回傳值它就是使用函式名稱,所以不必再使用變數宣告手續脫褲子哺哺了。而且函式中不得再使用MACD做為其






