You are on page 1of 11

Know How EasyLanguage PowerEditor

簡介
  OmegaResearch TradeStation 系列產品是交易者公認最好用的交易工具整合環境。你不只可以拿它來看盤,
使用它內建的諸多技術指標協助分析交易,你也可以自行開發屬意的指標,只要你想的到的。最重要的你可以
用它來開發交易系統協助你進入機械化交易的世界。把交易構想付之實現並量化,你可以給自己交易最重要的
東西──信心!
  這個開發並實現交易夢想的核心就存在它內含的 EasyLanguage PowerEditor 當中。它不是一般點選內建指
標,再加一些邏輯運算選項的陽春交易系統設計平台。它是透過一個類似 Pascal 語法的所謂 EasyLanguage 來
書寫你的程式碼,然後透過內部的編譯器產生執行效率高的機碼(這就是讓它屹立不搖的賣點)。甚至連它的
競爭者如 Equis 的 MetaStock 等多年來也只能不敢吭聲的當老二。
  雖然它名為「容易語言」,可是對許多沒有程式語言經驗的人來說它還真是宛如火星語一般的叫人直呼「不
容易」。特別對我們這些非英語系的地區又多一曾障礙可稱為最高級的「真不容易」。你的英語能力我沒辦法幫你
改善的,至於 EasyLanguage 我可以助你一臂之力!不過你的電腦概念我也無能為力,基本上你還是要靠你自
修加強,如果還是拿過去的理由讓自己逃避,那省點事就乾脆不要交易了吧!因為你放棄的是一條通往成功交
易的不二法門,那就「學海無涯、回頭是岸」吧。
  以下所附的幾則程式碼是未來全文所拿來探討的樣本,你可以節錄列以便對照文章內的解說達事半功倍之
效。對了、這些程式你都可以在你的 PowerEditor 找到,因為這些都是 TS2000i 所內建的。
MACD 指標:
{*******************************************************************
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(XAverage(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 Commentary}
#BeginCmtry
Commentary(ExpertMACD(Plot1));
#End;
MACD 函數之1:
{*******************************************************************
Description: Moving Average Convergence Divergence
Provided By: Omega Research, Inc. (c) Copyright 1999
********************************************************************}
Inputs: Price(NumericSeries), FastMA(NumericSimple), SlowMA(NumericSimple);
MACD = XAverage(Price, FastMA) - XAverage(Price, SlowMA);
MACD 函數之2
{*******************************************************************
Description: Exponential Average
Provided By: Omega Research, 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 = Price;
End
Else
XAverage = Factor * Price + (1 - Factor) * XAverage[1];
End;
MACD 多頭交易訊號
{*******************************************************************
Description : MACD Long Entry
Provided By : Omega Research, Inc. (c) Copyright 1999
********************************************************************}
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;
MACD 空頭交易訊號
{*******************************************************************
Description : MACD Short Entry
Provided By : Omega Research, Inc. (c) Copyright 1999
********************************************************************}
Inputs: FastMovAvg(12), SlowMovAvg(26), MACDMovAvg(9);
If CurrentBar > 2 AND MACD(Close, FastMovAvg, SlowMovAvg) Crosses Below XAverage(MACD(Close,
FastMovAvg, SlowMovAvg), MACDMovAvg)[1] Then
Sell ("MACD") This Bar on Close;
待續

 第一章:指標寫作

  現在開始我會逐行解說每一行程式碼的意義。我不想用一般手冊的說明方法,因為那樣子讓我覺得沒有效
率;它讓你懂一些方法,卻也讓你閤上書後忘的一乾二淨。我讓你在實做中學習,馬上披掛上陣!有成就感你
就不容易忘。然後我會舉一反三拿一些實例加強你的觀念進入深植,想忘都不可能!至於手冊、我希望你不要丟
掉它,放在身邊你會常常用它的;愛因斯坦說:不要去背找得到的資料來增加大腦的負擔。相信我!我這二十
多年涉獵許多電腦語言,沒有手冊我一行碼都掰不出來的。讓我們繫上安全帶,飛上天 HI 一下!
 

MACD 指標:

  Indicator?什麼是 Indicator?它就是指標、技術指標。不過在 TS2000i 它更泛指「可以顯示在圖型工作區的


指標」,也就是說它不只是包含計算指標部份,更包括了顯示部份(畫圖 PLOT)。以下就是一個完整的 MACD
指標程式,使用 EasyLanguage 語法完成的。

{*******************************************************************
Description : This Indicator plots MACD
Provided By : Omega Research, Inc. (c) Copyright 1999
********************************************************************}

  這一段我們稱為『備註』、
『註解』(Remark)。在 PowerEditor 中它會顯示為綠色,因為它不會被理會或被
編譯,但它方便我們閱讀,知道自己在這段程式企圖得到或想表現些什麼。

  註解被包圍在大括符裡頭{}。只要你把一段文字用大括符包圍起來,就是告訴 PowerEditor 不要去執行


這段東西,就算它裡面是計算式也不必去鳥它。因為它是寫給我這有血有肉的人看的,不是給你這大腦裝滿海
沙的傢伙看的。

Inputs: FastMA(12), SlowMA(26), MacdMA(9);

  Inputs : 『外來參數輸入』。
文法 Inputs 加冒號『:』之後輸入外來參數『FastMA』後加括符內填初設值『(12)』。如果有一個以上的
參數需要被代入,參數間用逗點隔開『,』。最後結束時以分號終止『;』。

Inputs 的部份是代表這些數據未來在我們使用該指標時是可以被更改的。如本例可以看到 12,26,9 就是


一般 MACD 的慣用參數。特別說明的是當我們在設定參數名稱(FastMA)時雖然沒人管你要命什麼名稱,但設
定一些可讀性高的名稱對你未來使用會是一件好事的。FastMA 一條快速的移動平均線比用 abc 來的叫人會意些
吧?

 
初值一般也引用常用數據來代入,如此在使用上你也會方便自己許多。為什麼我們要設外來參數呢?因為
它方便你在使用時迅速的更改配合當時需要。也許你有天想看看以 6,13,5 計算的 MACD 會長得如何?那好你直
接在圖形頁改參數便可。如果你不用 Inputs、那抱歉你只有再進入 PowerEditor 改新參數,然後重新編譯一次才
可以使用,當然你要是每到陰天閒的發慌我不阻止你如此幹,至少你孩子會對我感激涕零。

Plot1(MACD(Close, FastMA, SlowMA), "MACD");

  Plot1 呼叫 Plot1 函式(函式未來會提,現在你就當自己是皇上吆喝各司其職的小太監上場。有侍衣、侍


食、侍寢、、之類的他們有自己的專屬工作,只待你一聲令下,只是你要叫對人)。函式後面緊跟括符『()』,
同樣以分號結束敘述。括符內加入函式本身需要的參數或變數。加什麼呢?這時手冊就派上用場了!每一個函式
要加的參數是不一定的,所以手冊會幫你找到。你也可以利用線上手冊,點選右上像一本書的圖示或是選單的
Tools>EasyLanguage Dictionary。

  文法 Plot1(代入要顯示的數據,”顯示的文字字串”);同樣的各參數間以逗點相隔,以分號結束。這
裡有一個不同;字串輸入必須包含在“”之間。它藉以區隔特別是數字以文字不被處理而直接表現。比如說”3-
2”會表現 3-2 而不是變成1。

  Plot1 它有許多兄弟姊姊,排行由1到4。為什麼呢?因為 TS200i 設計成每個指標的顯示個數最大為4,


無法顯示更多。對了這四條線的當然包括你喜歡加在如 RSI 的超買或超賣的水平線,珍惜物資喔。

  這例子中第一個代入的數值變數,我們的 MACD 數據由另一個函式完成運算。也就是說函式之中另有函式!


其實不用大驚小怪,在程式語言這是很正常的事。你叫來服侍你吃飯的小太監當然需要再找御膳房的小太監幫
你張羅,不是這樣嗎?

  MACD()這個函式需要輸入三個參數。後兩個是我們提過的外部輸入的天數參數,就是算 12 天平滑平均減 26
天平滑平均。那用什麼來算呢?『收盤價』不是嗎?所以第一個參數我們置入 Close。在 EasyLanguage 中
Open、High、Low、Close、IF、THEN 等被稱為保留字(Reserved Word),也就是說這些字被定義為具專門用途的用
語,其意義被永久固定無法更改或被指定他用。不要懷疑這裡的他就是指你!所以在此這個 Close 就是代表收盤
價,無論你在任一程序中發現它都是那個意思。
待續

Plot2(XAverage(MACD(Close, FastMA, SlowMA), MacdMA), "MACDAvg");


 

  Plot2 自然是要畫第二條線,所以不再解釋 Plot 用法。這裡特別的是再加入一名採買食物的小太監


XAverage()。它是『平滑係數平均值』的計算函式,代入兩個參數,第一數據是被運算的基數如同剛才的 Close。
是呀!如果你是寫 XAverage(Close,9); 就是要計算9天的收盤平滑係數平均數(EMA)了。這裡因為我們要計算
MACD 指標,所以我們必須把計算結果的 MACD 再做一條它的9天平均。所以、我們第一個參數代入 Plot1 相同
的函式求出 MACD。第二參數就代入外部參數的 MacdMA,它的意義就是9天。咦?我剛才說溜嘴提到跟 Plot1
相同這句話嗎?隱藏多年的秘密竟然、、好吧!其實你的身世是、、、喔這不是秘密啦?你都知道了?好吧既然移
不開話題我只好坦白啦!你也可以這麼寫。

  Plot2(XAverage(Plot1, MacdMA), "MACDAvg");

  這個意義是一樣的。因為現在 Plot1 的數據就是代表 MACD 的運算結果。你可以嘗試改寫,將發現輸出結果


並沒有改變。不信?那往下看!

Plot3(Plot1 - Plot2, "MADiff");

  Plot3 看到了吧?我沒騙你吧!這裡是在表示我們 MACD 的『柱狀圖』部份。柱狀圖便是 MACD 減去 MACD 平均


的差值,表現這兩數據的差離、乖離(OffSet)。所以我們直接精簡表示為 Plot1 – Plot2。

  好!討論到此這個指標的核心已經結束。其他的程式碼是指標附加功能,我也會解釋。只是到此你應該有利
用現成函式自己寫個指標亮相的能力了。所以我想在此先談一些運用變化,讓你舉一反三增加幾個甲子的功力。

  讓我們來嘗試用不同的方式改寫這個指標。行動前我再解釋一個重要的部份,就是除外部參數外我們還必
須瞭解及學會運用內部參數或變數的運用。內部參數文法如同 Inputs,只不過它不用 Inputs 是用 Vars。例

  Vars : Macd_Now(0),Macd_Xavg(0),Macd_Diff(0);

  是不是差不多?我們一般會給變數初值為零,算是一個重置(ReSet)的動作。當然你如有特殊需要是可以
直接代入需要的數據不一定設為零。上點BCC電腦基本概念;Vars 就是我們向電腦要求分配一個記憶區供我
們置放一些運算結果。就像我們跟電腦要一張椅子,我拿椅子當比方就是它是張單人椅,請不要嘗試跟你的阿
那答想親蜜的擠一張椅子。所以啦、椅子永遠是要到的那一張,坐的人可以是任何一個人。以下例子說明內部變
數使用文法。

  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 視窗下輸入指標名稱(Name)『My_MACD』,Short_Name 可不要
或輸入簡短的花名如『Nmacd』。Note 嘛、就自己心情舒發啦,像是僅將此程式獻給我的小花之類的。就是說嘛!
第一次寫 TS2000i 的指標耶!

改寫 MACD 指標:

{*******************************************************************
Description : This Indicator plots MACD
Provided By : Omega Research, Inc. (c) Copyright 1999
********************************************************************}

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_Now, "MACD");
Plot2(Macd_Xavg, "MACDAvg");
Plot3(Macd_Diff, "MADiff");
Plot4(0,”0”);
 

  如何?是不是一樣的東西?我們甚至用了第四條線來畫零軸中線。最後你必須按『F3』進行,記住!所有
新寫或改寫的程式都必須按一下 F3 讓 PowerEditor 幫你檢視並編譯才可以使用。當回應你 Excellent!你就可
拍拍手鼓鼓掌,因為它簽了通行證給你。快去 TS2000i 打開一張圖然後按 F7 看看 Indicator 有沒有你的大作出現?
找到 My_MACD 點選有沒有熱淚盈眶呀?

  不過打擊接踵來到。你的柱狀圖為啥跟 MACD 一樣是條線呢?嗯、再回到我們的 PowerEditor 點選 File>


Properties 在 Indicator Properties – My_MACD 視窗下選 Chart Style > Plots > MADiff > Type > Histogram。記得改
完按確定後還是要按 F3 再編譯一次。自己可以嘗試看看如何把零軸改成點狀的線段表示。
待續

接下來、我們再舉一個例子寫另一個通用指標 Stochastic,就是我們慣稱的KD指標。我們設定通用天數為9
天,我們知道必須要運算RSV(不成熟隨機值)、與得到9天範圍的最高與最低。完成程式如下

Inputs: Length(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) * 2) + (sK / 3);
end;

Plot1(sK, "%K");
Plot2(sD, "%D");
Plot3(OverBought, "OverBought");
Plot4(OverSold, "OverSold");

  以上程式碼大致應該沒問題,不需再逐行解說了。所以我挑重點說明。這裡出現一個新東西,我們第一個接
觸的『判別式』;IF(邏輯判斷)THEN(執行)。我們把這個運算譯成白話就是:如果(IF)今天下雨?(事實
判斷)那麼(THEN)我們出門就要打傘(行動)。寫成程式為:
 

  IF 今天下雨? THEN 我們出門就要打傘;

  在『今天下雨?』這個條件判別將產生『真 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『運算元』!在四則運算沒有什麼問題,順序也依習慣做先乘除後加減。在『條
件式』寫法中可用邏輯運算元連接幾個條件判斷;如 AND、OR 等。特別的是大於或等於寫成>=,不可以寫=
>。

  拉回來再談下去。如果 THEN 之後我們要執行的不只是擔一步驟,那要如何解決?難道我們要一條一個


IF~THEN 的寫下去?當然不必如此!我們用一個方式來告訴它執行某範圍的動作,我們用 BEGIN 跟 END 來界
定多個動作。

  IF 今天下雨? THEN BEGIN


我們出門就要打傘;
出門前提醒家人外出也要帶傘;
檢查家裡的窗戶關了沒;
  END;

  上面的條件判斷後將執行三個動作。當然你還可以在 IF-THEN 中再加入另一個 IF-THEN,形成所謂的『巢狀


判別式』,往後碰到例子再加強說明吧。除上面談的 IF-THEN 之外我們又看到幾個常用函式,介紹一下用法!

  CurrentBar 是一個常常會呼叫的函式,不過它不必引入參數,它回傳的是一個數字,這數字跟你計算指標
的起始有效日數有關。在此例中、我們在資料開始的第9天後才能開始計算出 KD 的值,所以 CurrentBar 回傳為
1時就是第9天。所以我們在第9天之後開始計算 KD(CurrentBar > 1),如此你就不會在第9天之前看到亂七
八糟的指標數據了。
 

  Highest(比較數據, 範圍天數)。這個函式很容易瞭解因為它用 High+Est。這裡的 High 不是指我們説的當日最


高,而是一堆數據裡的最高值將被發現出來。所以我們如果輸入 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 天前的當日最高值。好囉這段程式到現在應該沒有感覺陌生的
語法了吧?老寫原來已經有的指標是否有點少些新鮮感?我們在繼續推進前最後再舉一個例子;它是在寰宇財
金[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);

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 不必經過這道手續,它是例外的;EasyLanguage 留下 Value1~Value999 給你「濫用」。為什麼說濫
用呢?就是它雖然使用方便,但會養成你寫程式的壞習慣,降低你的程式可讀性。像這幾行完成的程式當然無
妨,如果你未來寫個老太婆的纏腳布那麼長的程式,而你不停的、快樂的用上 ValueX;嘿嘿!你在寫完的半年
後想修改個內容你就會吃盡苦頭了,因為你的作品像極了結繩記事,那個長的像肉包子大的結到底是記錄發生
的那條大事?它會讓你悔不當初。

  接下來繼續談我們的 MACD 指標後半段。

{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");

  這段是在設定 TS2000i 發出警訊(Alert)的部份。當條件吻合的時候 TS2000i 會產生一個浮動視窗給你訊


息。還記得 Plot3 是那個數值嗎?對了它就是 MACD 的柱狀圖,也就是 MACD – MACD 的9天平均;也就是我們
一般定義空或多的方式。當 Plot3 穿越零軸(昨天於零下)時我們啟動警訊功能,提示我們行情翻多。這裡我們
不用 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 一起使用的。就是說我


們的 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 的語法,我們便可以結合上面兩行變成一個完整的敘述,如指標內的寫法。

{MACD Expert Commentary}


#BeginCmtry
Commentary(ExpertMACD(Plot1));
#End;

  最後一段敘述是在指標中加入一些指標功能解說。它可以方便新手或對你獨創指標不甚瞭解的使用者得到
一些使用資訊。#BeginComtry ~ #End; 是說明檔專屬的寫法,所有的說明敘述被包括在這個範圍裡。而
Commentary() 函式是輸入說明文字檔的地方,不要忘了文字字串要加“”。在此範例,當中輸入的是另一個函
式 ExpertMACD(Plot1),它是一個互動的說明文件,可以告訴你點選的 MACD 代表什麼意義或如何運用。當然
我們可以如此簡單的去寫說明功能:

#BeginCmtry
Commentary(“MACD 零軸以上為多頭,以下為空頭”);
#End;

  如此我們在 TS2000i 中開啟一個圖形,插入(F7)MACD 指標。然後我們在上面的功能表中選擇 Drawing>


Expert Commentray 便可發現一個說明的浮動視窗,隨著我們點選不同日期資料說明也會跟著不同;這是比較複
雜寫作的 TS2000i 專家說明互動文件。

  對了,有一個事情你應該知道!TS2000i 無法處理雙字元的文字;也就是說它看不懂中文,所以我們無法
在程式中輸入中文字串,它將會以亂碼呈現。當然這包括了我們所談過的註解或以上的說明運用。
待續

You might also like