[TS懶人包] [保險服務]

2010年2月28日 星期日

很遜的股票投資

首先…先聲明一點…本篇文章絕對沒有推薦大家去買什麼股票。聊的只是一種作法。

話說 2008 年 6 月,我開始以定期定額的方式在買中鋼,每個月頂多就 5000~6000 塊,以零股方式進場。一直到現在…

所以,我想也不是運氣好…因為我曾經買過 51 塊錢的中鋼,最低也只買到 21 塊。這樣下來到目前我的投資報酬率也很爛,只有 14% 上下。

雖然只有 14%…不過一年應該可以算有個 7~8 % 吧。其實也算是很不錯了…而且過程中完全不動大腦…就是挑一檔認為可以的績優股…然後把資金拆散,或是拿出每個月還可以接受的金額下去買進。不管價格、不管行情、不管技術分析,買就對了。



從上面的圖看到…我其實還有四個月沒買到股票…以目前那看那四個月如果還有買到…那報酬率應該可以更高一點…因為我可以把成本價格再拉低一些。

這種作法其實可以說一點難度都沒有…就是傻傻的一直買就是了。

至於什麼時候要賣…那就看個人了。我自己是打算一直放著就是了。因為我一開始進場的本意就是領股息股利的,並不在於賺價差。只是今天看到這樣的投資報酬率…似乎可以拿出來讓大家參考一下。(不過我想應該很多人一個月的報酬率就打死我這快二年的報酬率了吧)

2010年2月27日 星期六

變數的運用(一)

程式教學到目前…大家應該對寫程式有一個基本的概念了。接下來的部份,應該是著重在一些寫程式的小技巧了。在這個部份,我自己用到很多的變數,利用變數記錄目前的狀況、倉位、進出場價位等。許多的地方都需要用到變數。

一開始先來講進出場價位,這代表什麼?這代表著也許某個條件已經成立了,所以我們利用變數把預計的進出場價位先存下來,接下來我們會等待著第二個條件成立,也許第二個條件成立後會進場等。

以一個簡單的例子來說明狀況的儲存,假設我們在均線交叉的時候,記錄下當交叉當根 k 線的高低點,接下來,我們就以這個高低點來進出場。

這樣的程式該怎麼寫呢?首先是均線交叉的寫法,這應該要沒問題了。如果你對這個均線的交叉還有問題的話,那你應該要重頭開始看這系列的文章。

接下來在交叉的時候,我們利用一個變數把高、低點存下來。再來就是等待突破進場了。

整個說起來應該不難才對,所以就直接來寫吧:


vars: longLine(0), shortLine(0);

Value1 = average(close, 10);
Value2 = average(close, 30);

if Value1 cross over Value2 then begin
longLine = high;
shortLine = 0;
end;

if Value1 cross under Value2 then begin
shortLine = low;
longLine = 0;
end;

if longLine <> 0 then
buy next bar at longLine stop;
if shortLine <> 0 then
sell next bar at shortLine stop;



在這個程式可以看到我宣告了二個變數分別是 longLine 和 shortLine,這二個變數分別記錄著多單進場的價位和空單進場的價位。

再下來是二條均線的運算式。

然後是當均線有交叉動作發生時,需要作的動作。在這邊可以看到不再是一交叉就直接進場了,而只是在有交叉動作發生時,記錄下當根 k 線的高或低點。

比較需要注意的是,因為變數一設定值進去後,如果沒再去變動它,那麼那個值就會一直存在,所以什麼時候需要把變數作歸零的動作,是很值得注意的一件事情。

如果在這邊我沒有把另一邊的進場點作歸零的話,那麼在下面的進場語法就會產生不可預期的狀況囉。

沒把變數歸零的狀況:


在這邊所謂的歸零,是指在進場條件你必需排除掉的數值,可以看到我在進場條件的寫法是排除掉 longLine 或 shortLine = 0 的情況。

那就練習一下吧…來寫個 MACD 交叉後以交叉時的高低點作為進場點吧。

Global Server setp by setp

似乎還是有許多朋友不會設定 Global Server…或許是因為他的設定會一直跑掉跑到讓人想摔電腦了吧。這邊就從一開始安裝好後…如何把 GS 設定到一個可用的程度來一個完整的講解。

首先…當你安裝好 GS 後…一進到 GS 裡面應該會看到很多的 Symbol(目前這邊我已經沒圖了。所以就先不貼啦)。這時候請先按上方的 Edit,然後選擇 Select All,接著再按上方的 Edit 選擇 Delete Symbol。把一些一開始預設在 GS 裡面的 Symbol 通通刪掉。



這一步不作也可以。只是我個人不喜歡留一堆沒用的 Symbol 在裡面。顯得很雜亂。

接下來你的 Symbol 應該空掉了。然後接下來是設定 Exchange 的資料。點選 Tool - Edit Exchange List。



在跳出來的視窗找到 Taipei Stock Exchange of Taiwan。



接著點選右方的 Edit Exchange。可以看到下面的視窗。



照著圖上的設定即可。接下來點選這個視窗的 Edit Daylight Savings。



同樣照著設定即可。這樣…交易所的資料設定就完成了。

接著,在把資料匯入即可。如果你的資料是 xpo 檔,那應該預設就會是用 TAISE 這個交易所的設定,也因為一開始我們已經把交易所的設定設定正確了。就不會再有設定一直跑掉的問題了。那如果你已經有台指的資料在 Symbol list 裡面了…可是設定又一直跑掉怎麼辦呢?

那首先點選該 Symbol 後,右鍵選擇 Edit Symbol,接著點選上方的 Settings 頁面。



然後再交易所的地方先隨便選取一個交易所,並套用該交易所的資料,然後按下確定。接著,同樣的步驟再作一次…不過這次是選回 TAISE 這個交易所,並再套用一次。

這樣,設定就不會再跑掉囉。

2010年2月23日 星期二

2010 年 新春程式交易實戰課程



2010 年 新春程式交易實戰課程~開課

課程特色:

第一點:

運隆會講解策略的形成和金融商品價個波動的關係,讓你往後在寫策略程式時候會有清晰完整的概念.希望你能寫出如上圖表中運隆的策略程式績效,甚至更棒!

第二點:

實戰講師講解策略如何構思出來,策略如何寫,策略的回測,策略的執行和策略的放棄完整過程.由飛天象,HTS阿政,D.K三大實戰名家解說自己的完整過程.並將程式送給學員回家練習和熟悉所有實戰過程.一共6支程式

第三點:

學員一律贈送三個月TOUCHANCE 下單平台,免費教學和使用.

第四點:

A__程式交易大師Parkson 教學如何將平凡策略提升成為進階策略程式,B__有上寰宇Parkson基礎課程者.本課程優惠折價1800元的學費.在本課程結束後優惠退費.

上課時間:如下表,連續5週的周六下午 1:00~4:00

上課地點:台北市火車站附近的教室(開課前會公佈和通知)

上課費用:優惠價$19800元(敬請把握優惠時間 ; 夏季實戰課程費用是360,00元)

上課工具:自備筆電和軟體.

時間

課程大綱

課程說明

3 月 20 日 ( 六 )

下午 : 13:00

下午 : 16:00

運隆:

勝率程式如何寫

詳細解說 金融波動和大自然和人類思想的關係,如何去切入買賣點

3 月 27 日 ( 六 )

下午 : 13:00

下午 : 16:00

TOUCHANCE 下單平台

TOUCHANCE 下單平台

免費贈送 3 個月使用權 和安裝指導

飛天象:

第 1 次程式分享

完整程式範例解說:

由飛天象、阿政、 D.K 三個人

共 6 支策略程式的研討。

內容從程式構想、程式撰寫、回測程式開始交易、到放棄策略程式的完整過程教學和解說。

4 月 3 日 ( 六 )

下午 : 13:00

下午 : 16:00

飛天象:

第 1 次程式分享

阿政:

第 2 次程式分享

4 月 10 日 ( 六 )

下午 : 13:00

下午 : 16:00

D.K :

第 1 次程式分享

D.K :

第 2 次程式分享

4 月1 7 日 ( 六 )

阿政:

第 2 次程式分享


下午 : 13:00

下午 : 16:00

PARKSON :

將已經上手的策略程式進階使用

PARKSON 策略程式如何進化的教學。

這 90 分鐘是屬於程式交易的進階課程的引言和 PARKSON 寰宇初階課程內容不相同。

下午 : 17:00

下午 : 20:00

聚餐 研討

研討會課程結束

飛天象、 DK 、阿政、 PARKSON 運隆 和 所有學員一起聚餐

課程表和報名表下載處:

http://cid-0ac4e120bb924049.skydrive.live.com/browse.aspx/.Public

函數講解 - TrueRange

接下來提到的是 TrueRange,這個函數實在滿簡單的…因為打開它來看只有一行程式碼。

TrueRange = TrueHigh - TrueLow;


所謂的 TrueRange 翻譯為真實區間。他是利用目前的高低點和前一根 k 線的收盤價來計算。所以又可以看到二個新函數了, TrueHigh 和 TrueLow。

這邊以 TrueHigh 來說明:

If Close[1] > High Then
TrueHigh = Close[1]
Else
TrueHigh = High;



也是很簡單的一個判斷,如果前一根的收盤價比目前的高點高,那 TrueHigh 就是以前一根收盤價為主。如果目前的高點比前一根收盤高,那 TrueHigh 就是目前的高點。

再由 TrueHigh 和 TrueLow 二個值相減,就可以得到 TrueRange 了。

整個從 ADX 函數追程式碼追到這邊,算是一個完結了。這樣整個過程其實是有點無趣的…不過他卻很有意義。因為如果你覺得某個函數很好用…但是在其它平台上面卻沒有提供…你就必需這樣一個函數一個函數去作轉換。

函數講解應該會到這邊結束,我希望大家能多去看看其它的函數…照樣子去追幾個比較常見的函數內容。並去了解他的程式寫法。會對寫程式有一些幫助的。

2010年2月22日 星期一

函數講解 - DMI (DMIPlus)

在上一篇文章內提到了 ADX 這個函數,而 ADX 又使用到了 DMI 這個函數…所以這邊主要就是來講一下 DMI 這個函數的內容囉。其實打開 DMI 函數的程式碼你會發現其內容並不複雜…因為主要的計算是放在 DMIPlus 和 DMIMinus 這兩個函數裡面…這邊會順便用 DMIPlus 來說明一下。

首先是 DMI 的程式碼:

Inputs: Length(NumericSimple);
Variables: DMIP(0), DMIM(0);

DMIP = DMIPlus(Length);
DMIM = DMIMinus(Length);

If DMIP + DMIM = 0 Then
DMI = 0
Else
DMI = 100 * AbsValue(DMIP - DMIM) / (DMIP + DMIM);



同樣的在一開始用了 input 和 vars 宣告一些變數,input 的部份還是週期,而二個變數 DMIP 和 DMIM 則呼叫了另外二個函數來計算得到數值。

最後的 If 判斷,則是簡單的計算囉。所以這邊就跳過啦。直接打開 DMIPlus 來講解了。


Inputs: Length(NumericSimple) ;
Variables: Counter(0), TRange(0), MyRange(Length), PlusDM14(0), PlusDM(0), MinusDM(0);

If CurrentBar = 1 Then Begin
MyRange = Length;
DMIPlus = 0;
PlusDM14 = 0;
TRange = 0;
For Counter = 0 To MyRange - 1 Begin
If High[Counter] - High[Counter+1] < 0 Then
PlusDM = 0
Else
PlusDM = High[Counter] - High[Counter+1];
If Low[Counter+1] - Low[Counter] < 0 Then
MinusDM = 0
Else
MinusDM = Low[Counter+1] - Low[Counter];
If MinusDM >= PlusDM Then
PlusDM = 0;
{MinusDM not set to 0 because it is not used}
TRange = TRange + TrueRange[Counter];
PlusDM14 = PlusDM14 + PlusDM;
End;
If TRange <> 0 Then
DMIPlus = 100 * PlusDM14 / TRange
Else
DMIPlus = 0 ;
End
Else
If CurrentBar > 1 Then Begin
If High[0] - High[1] < 0 Then
PlusDM = 0
Else
PlusDM = High[0] - High[1];
If Low [1] - Low [0] < 0 Then
MinusDM = 0
Else
MinusDM = Low[1] - Low[0];
If MinusDM >= PlusDM Then
PlusDM = 0;
{MinusDM not set to 0 because it is not used}
If MyRange > 0 Then Begin
TRange = TRange[1] - (TRange[1] / MyRange) + TrueRange;
PlusDM14 = PlusDM14[1] - (PlusDM14[1] / MyRange) + PlusDM;
End;
If TRange <> 0 Then
DMIPlus = 100 * PlusDM14 / TRange
Else
DMIPlus = 0 ;
End ;


很長的一段程式碼…不過其實慢慢拆解起來的話…也沒什麼難懂的地方才對。

首先的 If 判斷在之前也遇到過了,主要是判斷目前的 K 線是不是圖上的第一根 k 線,如果是第一根 k 線的話就是執行那個部份的運算,不是第一根 k 線就是執行下面的 else 部份運算。

我很強烈的建議大家在寫程式的時候好好的排一下版,因為版面排的好,以後再修改程式的時候會少花很多的時間。在 blog 上貼出來的程式碼會整個縮排縮到最左邊…所以還是打開 PowerEditor 來對照程式會比較容易了解。

以一張圖來說明…首先我會先把這個程式拆成二個部份來看:



首先就是第一個大段的 If 和後面的 Else 先拆開…再接著看第一段 If 的內容。

接下來這第一個大段的 If 先執行了一些變數歸零的動作後,進到了一個 For 迴圈作運算,接下來又分為兩個 If .. Else

If High[Counter] - High[Counter+1] < 0 Then
PlusDM = 0
Else
PlusDM = High[Counter] - High[Counter+1];
If Low[Counter+1] - Low[Counter] < 0 Then
MinusDM = 0
Else
MinusDM = Low[Counter+1] - Low[Counter];

這邊可以看到他判斷了如果 High[0] - High[1] < 0 的話,PlusDM 就設為 0;那如果 High[0] - High[1] >= 0 的話,PlusDM 就會等於 High[0] - High[1]。

接著算完了 PlusDM 和 MinusDM 後,在比較這二個值。

接下來又看到了一個新函數了,就是 TrueRange,這邊也是先跳過,我們下一篇再來看這個函數。只要先知道他計算了一個值出來就行了。

接著就是運算 DMIPlus 的過程了。而另一個大區塊就是當 CurrentBar 不等於 1 的時候的運算囉。


我想整個拆解的過程並不太需要了解他背後運算的意義到底何在…因為那是一大堆數學公式,你並不需要知道為什麼 High[0] - High[1] < 0 的時候 PlusDM 會等於 0。主要我希望大家看的是程式的寫法,為什麼要這樣子寫、還有各種 If、For 的運算等等。

程式交易 - 201002 績效

新年快樂。二月合約結算…這個月應該是會不錯的…只是失敗在加碼的時機點。把原本的獲利吃掉了很多去。果然什麼時候該加碼、什麼時候該減碼…還是一個研究不完的課題。在留倉單的部份到底是要等被巴個幾次後再加碼?還是等有獲利的時候加碼呢?很值得仔細思考…目前也想到了個比較新的加碼方式了…就等下次機會來臨了。


本月績效:-144 點

Y拍程式:
10K 波段:240 點
10K 當沖:125 點
15K 當沖:378 點
30K 波段:398 點

2010年2月21日 星期日

函數講解 - ADX

接下來的幾篇文章會是函數的程式碼講解…看懂了別人的程式碼…對自己寫程式的功力也會有進步的。所以這篇先來講解 ADX 函數的程式碼。一開始就先看看 ADX 這個函數吧。


Inputs: Length(NumericSimple);
Variables: Counter(0), CummDMI(0), Return(0);

Return = 0;

If CurrentBar >= 1 AND Length > 0 Then Begin
If CurrentBar < Length Then begin
CummDMI = 0;
for Counter = 0 To CurrentBar - 1 Begin
CummDMI = CummDMI + DMI(Length)[Counter];
End;
Return = CummDMI / CurrentBar;
End
Else
Return = (ADX[1] * (Length - 1) + DMI(Length)) / Length;
End;

ADX = Return;


這個函數一開始是變數宣告。有 input 和 vars,input 代表要傳遞進去的參數…這邊是一個 Length 代表著要計算的 ADX 週期。

接下來程式把 Return 這個變數歸零。

接著就是一個 If 的判斷,在這邊用到了個 CurrentBar >= 1 代表著目前的 K 線是大於或等於第一根 K 線,假如你開出了 500 根 K 線,那第一根 K 線的 CurrentBar 就會等於 1。這邊是一個計算上的錯誤預防…避免沒有 K 線資料程式還進到運算式裡面。

接下來是另一個 If 判斷,這邊寫下了 CurrentBar < Length ,假如目前的 Length 是使用 9 的話,那前 9 根 K 線就會進到這個判斷式裡面。

這邊我利用均線的方式說明一下…如果你今天要計算的是 20 日線均的話,那表示你必需最少需要有 20 根 K 線的資料才能計算,也就是說如果 CurrentBar < 20 的話…你必需要有另外的計算方式,或是直接跳過這 20 根 K 線,計算出來的值才會正確。

所以這邊是表示如果 CurrentBar < Length ,也就是說目前的 K 線是在你要計算的週期之內的話…就用下面的方式計算。

而這邊的計算方式是先把 CummDMI 歸零後,進到一個 For 的迴圈裡面。

在這個 For 迴圈裡,用了一個 Counter,Counter 從 0 一直到 CurrentBar - 1,假如目前的 CurrentBar 是 5 的話…那 Counter 就會是從 0 到 4,並計算 CummDMI 這個值。

這邊就用到了 CummDMI = CummDMI + DMI(Length)[Counter]; 大家應該還記得盒子裡的東西和盒子的名字這個例子。

不過這邊又用到另一個函數,也就是 DMI,先暫時把它放到一邊,下一篇文章我們再來看 DMI 這個函數在作什麼。

接下來回到如果 CurrentBar 是 5 的話,那個 For 迴圈的計算,就會是 CummDMI = CummDMI + DMI(Length)[0] 一直到 CummDMI = CummDMI + DMI(Length)[4]。在 For 迴圈計算完之後,有個 Return = CummDMI / CurrentBar;

這邊就算計算完成後。而最後的 Return 值就會回傳到你呼叫這個 ADX 函數的地方了。

如果 CurrentBar >= Length 的話…就是另外的計算方式。也就是:

Return = (ADX[1] * (Length - 1) + DMI(Length)) / Length;

這個部份。可以看出來他相對比較簡單一點…沒有用到 For 迴圈了。這邊是直接把上一根的 ADX 值拿出來運用。有一點遞迴的想法在裡面…比較常見的遞迴是費波南希係數,大概的想法是這樣:

A = 1
B = 1
C = A + B

也就是除了第一個和第二個數之外,其餘的數都是前二個數值相加,所以可以得到 1, 1, 2, 3, 5, 8, ... 這樣的數列。

而這邊則是用到了上一根的 ADX 數值,再去計算出目前的 DMI 數值,兩個相加再去除以 Length 來得到目前的 ADX。

最後就是 ADX = Return ,把計算得到的 Return 值回傳到 ADX 去囉。

下一篇就來說說 DMI 吧。

請注意明天下單機自動換月的狀況

當初在寫換月條件時是超過第三個星期三就會自動換月。不過想不到今年過年結算是延了這麼久…所以還請多加注意。如果目前還有留倉單的朋友也先跟您說聲抱歉了。

2010年2月20日 星期六

指標的運用 - MACD 交叉程式

在寫完了均線的交叉程式後…我想 MACD 就變的很簡單了…只要知道 MACD 的運算方式…再把均線交叉的兩條線換成是 MACD 線和 MACD 均線即可。在上一篇文章內已經提到了 MACD 的運算方式了…所以這邊就直接把進出場程式寫出來吧。


Value1 = MACD(close, 12, 26);
Value2 = XAverage(MACD(close, 12, 26), 9);

if Value1 cross over Value2 then begin
buy next bar at market;
end;
if Value1 cross under Value2 then begin
sell next bar at market;
end;


績效依舊不太好…所以依舊只能算是個例題。

指標的運用講解到這邊…我猜想大家應該可以簡單的了解到原理了…其它的指標方式都可以這樣子使用。如果不是內建指標的話…那只要在網路上找到計算的方式…也可以直接的用進來。

比如說 TradeStation 內沒提供的 KDJ 指標,只要找到計算方式(可以 Google 一下),就可以找到 KDJ 的計算是這樣:

KDJ的计算
        今日收盘价-N日内最低价
今(N)日RSV=(—————————————)× 100 ;
       N日内最高价-N日内最低价

今(N)日K值=2/3昨日K值+1/3今(N)日RSV ;

今(N)日D值=2/3昨日D值+1/3今(N)日K值 ;

今(N)日J值=3今(N)日D值-2今(N)日K值 。

K、D初始值取50。

知道了公式後…其實要寫成指標就簡單了:

Input: N(13), M1(7), M2(3);
Vars:KDJRSV(0), KDJK(0), KDJD(0), KDJJ(0);

If CurrentBar = 1 Then begin

KDJRSV = 0;
KDJK = 50;
KDJD = 50;
KDJJ = 0;
end
Else begin
KDJRSV = (Close - Lowest(Low, 9)) / iff((Highest(High, 9) - Lowest(Low, 9)) = 0, 1, (Highest(High, 9) - Lowest(Low, 9))) * 100;

KDJK = KDJK[1] * 0.66 + KDJRSV * 0.34;
KDJD = KDJD[1] * 0.66 + KDJK * 0.34;
KDJJ = (3 * KDJK) - (2 * KDJD);
End;

Plot1(KDJK, "K", Red, 2);
Plot2(KDJD, "D", Green, 2);
Plot3(KDJJ, "J", Blue, 1);


或是不要寫成指標直接運用在策略裡面…也應該不會是問題才對囉。

有興趣的就用 KDJ 寫個進出場策略吧。接下來的文章會轉到一些內建函數的程式碼講解。多看一下內建程式碼其實對一開始不會寫程式的人會有很大的幫助的。

2010年2月17日 星期三

指標的運用 - 均線交叉程式

相信這個程式只要知道均線的運算方式…要寫出來應該不是問題才對…首先就是 20 日均線和 60 日均線的計算方式:Average(close, 20) 和 Average(close, 60)。運算出來後…接下來就是寫進場囉。

這樣的程式可以很簡單的寫成:

if average(close, 20) cross over average(close, 60) then
buy next bar at market;
if average(close, 20) cross under average(close, 60) then
sell next bar at market;


我想應該沒什麼人會看上這隻程式的績效的…雖然在 30 分 K 上執行還可以算獲利…不過在其它週期上就有點慘了…所以當然這還是只能算是個例題而已。


接下來我想談一下指標的運用…我想應該很多人在作進出場判斷的時候會運用到指標…那指標該怎麼寫進策略裡呢?

來以 MACD 為例…首先…你應該要知道怎麼去新增一個指標進入 TradeStation 的 k 線圖上。所以現在你應該可以在 k 線圖上看到 MACD 的指標了。

不管什麼樣的指標…只要是 k 線圖上顯示的出來的…那就表示你可以參考這個指標的程式寫法…並把這個寫法放到你的策略裡面。所以…就讓我們打開指標 MACD 的程式碼吧:



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", iff(plot3>0, yellow, blue));

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


上面就是 TradeStation 的 MACD 指標程式碼。你必需去解讀這個程式碼的寫作過程…所幸…大部份的指標程式內容都相當的容易。

以 MACD 來說…指標程式比較重要的其實就三行而已…

Plot1(MACD(Close, FastMA, SlowMA), "MACD");
Plot2(XAverage(MACD(Close, FastMA, SlowMA), MacdMA), "MACDAvg");
Plot3(Plot1 - Plot2, "MADiff", iff(plot3>0, yellow, blue));


Plot 是畫線指令…它只能運用在指標內…所以這邊可以看到這三行就是畫出三條線。這三條線分別包含了 MACD 線、MACD均線和 Diff等。

從這裡面…你就可以簡單的找出 MACD 的計算方式了。

所以,假設我們的策略裡面需要 MACD,那就會是 MACD(Close, FastMA, SlowMA),括號裡面的三個變數分別是收盤價和二個參數…如果你策略裡面是固定的參數…那其實就直接打上去就行了。

通常我會這樣用:

MACD(Close, 12, 26);


這樣是比較多人使用的 MACD 參數;如果你需要的是 MACD 均線…那就是在把 MACD 去算平均囉:XAverage(MACD(Close, 12, 26), 9);

這邊用到的 XAverage 是個新函數…你應該去看看他的函數程式碼。

現在,你要在策略裡面使用 MACD 應該沒問題了。接下來我再用 RSI 作一個例子,首先…打開 RSI 的指標程式碼:

Inputs: Price(Close), Length(14), BuyZone(30), SellZone(70), BZColor(Green), SZColor(Magenta);

Plot1(RSI(Price, Length), "RSI");
Plot2(BuyZone, "BuyZone");
Plot3(SellZone, "SellZone");

If Plot1 > SellZone then Begin
Alert("The RSI is in overbought territory");
SetPlotColor(1, SZColor);
End
Else
If Plot1 < BuyZone then Begin
Alert("The RSI is in oversold territory");
SetPlotColor(1, BZColor);
End;

{RSI Expert Commentary }
#BeginCmtry
Commentary(ExpertRSI(Plot1, Plot2, Plot3));
#End;


重要的是什麼呢?沒錯…還是那 Plot 指令:

Plot1(RSI(Price, Length), "RSI");
Plot2(BuyZone, "BuyZone");
Plot3(SellZone, "SellZone");


在這邊可以看到其實 RSI 的運算更簡單了…在 RSI 函數裡面都作完了…所以你只需要這樣:RSI(Close, 9) 就可以計算出 9 日的 RSI 值了。


最後,練習時間又到啦…來寫個 MACD 交叉進場的進出場策略吧。

2010年2月13日 星期六

祝大家新年快樂

預祝大家在新的一年裡能夠事事順利、買多就漲、放空就跌、績效長紅。

移動平均線的交叉

上一篇文章最後希望大家能動手計算一下 20 日的移動平均線資料…並給了一個簡單的提示…就是用上 Average 的函數。當然…如果你使用一開始介紹的 Summation 函數並自行去作運算其實也是可以的。

首先先來看看 Average 這個函數的內容:

Inputs: Price(NumericSeries), Length(NumericSimple);
Variables: Sum(0), Counter(0);

Sum = 0;

For counter = 0 To Length - 1 Begin
Sum = Sum + Price[counter];
End;

If Length > 0 Then
Average = Sum / Length
Else
Average = 0;


以上為 TradeStation 在 Average 函數的程式碼。基本上如果對 For 迴圈和 If 判斷都了解的話,這個程式其實沒什麼難度的。首先一開始先把 Sum 這個變數歸零,接著利用一個 For 迴圈來計算出總和,最後再除以個數就得到我們需要的平均價了。

那一開始的 Input 代表什麼呢,我們在呼叫 Average 這個函數的時候會這樣子用:

var = Average(close, 20);

可以看到在 Average 後面我輸入了 (close, 20) 這樣子的程式碼,這代表著我傳了二個參數,分別是收盤價(close)和我所需要計算的週期(20)到 Average 這個函數裡面。

而 Average 就用 Input 來接收這二個參數。

函數的運算過程會如下面的方式:


而最後的回傳方式則會類似 Average 函數程式碼最後的那部份,也就是它把函數的名字直接套用進來,並給他一個數值。

簡單的介紹完了 Average 這個函數後,接著要怎麼計算上一篇文章提到的例題呢,其實很簡單,一點難度都沒有:

var = Average(close, 20);


這樣就搞定了…其它的事情都在 Average 這個函數內完成了。

再來要介紹一下大家常用到的交叉,所謂的交叉又分為黃金交叉和死亡交叉,通常所謂的黃金交叉代表著短均線向上穿越長均線,而死亡交叉代表著短均線向下穿越長均線。

所以這邊要介紹二個指令,分別是:cross over 和 cross under。

其實這個從字面上來解釋就行了…所謂的 cross over 就是往上穿越的意思,而 cross under 就是往下穿越了。

在這兩個指令的前面你必需放上兩個數值…因為必需要有兩個數值的比較才會有所謂的穿越情況產生…所以如果我們簡單以 20均線往上穿越 60均線的話…應該會是這樣子:

Average(close, 20) cross over Average(close, 60);


在穿越的這個比較方式…是以前一根的數值和目前這根 k 線的數值來作比較的…所以如果你要複雜一點的寫法的話…可以寫成下面這樣:

Average(close, 20)[1] < Average(close, 60)[1] And Average(close, 20) > Average(close, 60);


簡單的說就是前一根的 20 均小於 前一根的 60 均,而目前這根的 20均 大於 目前這根的 60 均。

練習時間又到了:請寫出一個 20 日均線和 60 日均線的程式…黃金交叉則買進,死亡交叉則賣出。

2010年2月12日 星期五

簡易的換日判斷(第一個練習程式)

在這邊先介紹一下怎麼簡單的判斷是否換日了?換日可以很簡單的想到日期變的不一樣了,那從 k 線上怎麼判斷呢?我們可以很簡單的抓出 k 線的日期來作是否已經換日的判斷。

換日的判斷如下:

if date <> date[1] then begin
end;


上面的 if 判斷抓出了日期,而 date <> date[1] 代表著目前這根 k 線的日期和上一根 k 線的日期不一樣!

什麼時候會相鄰的兩根 k 線日期會得到不一樣的結果呢?那當然就是今天的第一根 k 線和昨天的最後一根 k 線啦。透過這樣子的判斷我們可以很簡單的得到是否已經換日的條件出來了。

那麼以這樣子的判斷再加上一些條件…就可以很簡單的寫出跳高買、跳低賣囉:


if date <> date[1] and open > close[1] then begin
buy next bar at markte;
end;
if date <> date[1] and open < close[1] then begin
sell next bar at market;
end;


簡單說明一下:
假如目前的 k 線日期不等於上一根 k 線的日期,而且目前的開盤價大於上一根的收盤價,則買進。

是不是有感覺到寫程式有愈來愈簡單的樣子了…基本上只要你能夠把邏輯條件想出來、量化出來…要轉成程式碼其實並不是這麼困難的事。


除了上面的寫法外…再介紹一個更簡單的寫法,因為這樣子的條件並不會因為每日 k 線波動的差異產生不一樣的結果…因為昨天的收盤價是固定的、今天的開盤價也是固定的。所以簡單的寫成這樣:

if opend(0) > closed(1) then begin
buy next bar at market;
end;
if opend(0) < closed(1) then begin
sell next bar at market;
end;


這邊用到了二個新函數,順便介紹一下,分別是 opend(0) 和 closed(1)。

opend(0) 代表著今日的開盤價
closed(1) 代表著昨日的收盤價

簡單的記法 open 代表開盤價,而 d(day) 代表天,所以 opend 就代表著某一天的開盤價,後面接上 (0) 代表就是今日的開盤價,如果用上了 (1) 那就表示是昨天的開盤價囉。

在分線週期內要取得日線的開高低收,就可以分開用上 opend、highd、lowd和 closed 等四個函數。


最後一個跳高買、跳低賣的方式…如果希望是以開盤價觸價就進場,而不是等待第一根 k 線收完呢?要觸價進場…也就是需要用到 stop 單囉…而 stop 單只能在當根判斷的時候就立刻進場…透過這樣的想法繞回來後,你就知道這個進場必需寫在昨天的最後一根 k 線上才能在隔天的開盤立刻進場了。


if time = 1345 then begin
buy next bar at close + 1 stop;
end;
if time = 1345 then begin
sell next bar at close - 1 stop;
end;


這是以 5 分線為例子…5 分線的最後一根 k 線時間為 1345,所以上面的例子判斷是在最後一根 k 線的時候,寫下了進場的條件:下一根買進在目前收盤價 + 1 點,或是賣出在目前收盈價 - 1 點的價位。

下一根其實就是隔天開盤的那根 k 線囉,所以買進在目前收盤價 + 1 點…代表的就是隔天是開高的意思。

不過如果實際的去跑上面的例子…會發現有時候在第一根 k 線又買又賣的…那是因為隔天開盤的第一根 k 線把買進和賣出的點位都碰到了…

所以這只是個例子…通常我會特別避免掉同一根 k 線同時產生二個交易訊號出場。因為這樣在 k 線圖上是沒辦法分的出哪個先、哪個後的。這也會在回測或實際執行上出現一些問題。


下一個練習題:計算出20根k線移動平均線。(hint:移動平均線的計算為 Average 函數)

2010年2月11日 星期四

進出場指令

介紹到這邊…總算是進入程式交易的核心了。那就是進場和出場…基本上進場的指令就是 buy 和 sell,分別是買進和賣出。而出場則是 exitlong 和 exitshort,分別是多單出場和空單出場。下面分別介紹幾種進場和出場的模式。

首先是下一根 k 線進出場,那為什麼需要等到下一根 k 線呢?因為在盤中的時候,k 線是會一直跳動的…所以如果不是等待 k 線收完線就立刻進場,那可能會因為 k 線跳動的情況使得成立的條件又消失了。

所以會有以下的程式碼:

buy next bar at market;
sell next bar at market;

exitlong next bar at market;
exitshort next bar at market;


這樣的程式分別代表:
在下一根 k 線開盤買進。
在下一根 k 線開盤賣出。

在下一根 k 線開盤多單出場。
在下一根 k 線開盤空單出場。

那如果希望能夠用 this bar 的方式呢? TradeStation 2000i 只支援 this bar at close 的方式,也就是進出場在目前這根 k 線的收盤價。

不過其實在交易執行的過程中…程式是沒辦法知道 k 線什麼時候才算收盤的…所以它的判斷方式還是需等待下一根 k 線出場後,它才知道原來上一根 k 線已經收線了。

也就是 next bar at market 其實是和 this bar at close 是一樣的。只是在 k 線圖上面標示的進出場點位會不同而已。這點還請特別注意一下…因為有時候收盤價你是買不到的,以日線程式來說…你程式寫著你要進場在今天的收盤價,可是你必需等待明天開盤後才知道原來今天已經收盤了。所以其實你能進場的價位是在明天的開盤價。

不過程式回測卻是把你進場的點位標示在今天的收盤價,所以這就會產生了回測時候績效是錯誤的情況了。


再來就是,如果我希望是觸點就進出場的話呢?那就必需用到 stop 或是 limit 了。關於 stop 和 limit 的分別…請先參考一下:搞清楚 Stop 和 Limit

這個部份在進出場的話會寫成這樣:

buy next bar at 9000 stop;
sell next bar at 6000 stop;

exitlong next bar at 9000 stop;
exitshort next bar at 6000 stop;

等…分別代表著:
從下一根 k 線開始觸價 9000 點買進。
從下一根 k 線開始觸價 6000 點賣出。

從下一根 k 線開始觸價 9000 點多單出場。
從下一根 k 線開始觸價 6000 點空單出場。

當然你可以把 9000 或 6000 等固定的點位在程式內用一個變數取代它…而這個變數可能會是你計算出來的某個價位。

比較需要注意的是…即使是用觸價就進出場的方式…你還是必需等待下一根 k 線才會開始執行你的命令。假如你開的是 5 分 k 並寫下這樣的程式碼:

if time = 900 then
buy next bar at 6000 stop;


這樣最早的進場會是在 9:00 那根 k 線的下一根。並不會在當根 k 線就產生訊號。


基本上我是不太建議用 this bar 的方式來寫策略,因為會有回測的訊號和即時的訊號不一樣的情況產生。


總算可以有讓大家練習的機會了…請寫一下跳空開高就買進,跳空開低就賣出的程式吧。至於怎麼判斷開高、開低,那就動動頭腦想一下囉。下一篇會把這個練習程式寫出來。

2010年2月10日 星期三

函數的運用

這篇將介紹怎麼運用函數。首先…什麼是函數呢?想像一下你是一個原古時候的人…現在你需要砍一顆樹…然而你手邊什麼樣的工具都沒有,所以也許你會找一塊石頭,並想辦法把它磨成一把斧頭來砍那顆樹。當你成功的把樹砍倒了之後呢?你會順手把這把斧頭丟掉嗎?並不會…你會把斧頭留著等下次還需要砍樹的時候再拿出來用。

所以函數就產生了,那把斧頭就是一個函數。當你需要砍樹的時候你就會把那個函數拿出來用。

你可以建立很多的函數…因為你並不是只需要砍樹而已…你也許還要撈魚、生火、打獵等等。

經過這樣子的說明…應該會對函數有一個基本的了解。而在 TradeStation 裡面提供了很多的基本函數可以讓你運用。打開 PowerEditor 並選擇 File - Open 後進到 Function 內你就可以看到它所提供的函數。

基本數值運算 這篇提到了均價的算法。裡面的範例我寫到了五根 K 線的收盤價均價計算的程式。可是當你需要計算到 100 根 K 線的時候怎麼辦呢?難不成還真的寫了一大串程式碼去計算嗎?我想這當然也是可以,不過也太花時間了點。

所以讓我們來運用一下函數來計算吧:

var = Summation(close, 100) / 100

這樣是不是簡單多了呢。

這邊用到的函數是 Summation,它的程式碼加下:

Inputs: Price(NumericSeries), Length(NumericSimple);
Variables: Counter(0), Sum(0);

Sum = 0;

For Counter = 0 To Length - 1 Begin
Sum = Sum + Price[Counter];
End;

Summation = Sum;

可以看到程式其實是用了個 For 迴圈來累加出你所要的數值和,接著我們只要再把總和除以個數就可以得到均價了。

透過這樣子的函數運用…將可以大大的簡少寫程式所花的時間。

不過如果你今天所需要的功能 TradeStation 內並沒有提供…那該怎麼辦?如果這個功能不是很常用到…那也許你考慮直接在你目前的程式碼實作出來即可;不過如果是很常會運用到的東西…那還是花點時間把這個功能直接寫成函數會減少未來寫其它程式所花的時間。

2010年2月9日 星期二

基本迴圈運用

所謂的迴圈,就是重覆的去執行某一段的程式碼。比較常用到的是 For 迴圈。這邊就基本的介紹一下 For 迴圈的運用。

一個 For 迴圈的程式會像下面這樣:

var = 0;

For Value1 = 1 to 10 Begin
var = var + 1;
End;


上面的程式碼執行後會變怎麼樣子呢?首先一開始看到的是我把 var 設定為 0 ,之後進到了一個 For 的迴圈,在這邊設定了 Value1 = 1 開始,然後一直執行到 Value = 10,也就是執行了 10 次。

所以,當一開始進入到迴圈的時候 var = var + 1; 所以會等於 var = 0 + 1。在這邊也許又會有個問題出現,為什麼第一個 var 不是代表 0 呢?

這邊簡單的說明的話…你宣告了一個 var 的變數後,電腦會在記憶體裡面保留一個空間在儲存 var 的資料,你可以想像一個盒子,這個盒子被你取名叫作 var,盒子裡面可以裝你想裝的東西。

而在一個運算式被系統讀取到了之後,等號的左邊,系統抓到的是叫作 var 的這個盒子出來;而等號的右邊,則是把 var 盒子裡的東西取出來。

也就是:
等號的左邊為盒子的名子
等號的右邊為盒子裡的東西

所以 var = var + 1 代表著我現在要把東西裝進名字叫作 var 的這個盒子,那我要裝的東西是什麼?我要裝的東西是 var 這個盒子裡面目前有的東西再加上 1。

(希望大家可以了解這個很不容易了解的說明…)

回到 For…

所以這個 For 迴圈一直在執行著 var = var + 1 的動作,執行了十次。也就是:
var = 0 + 1; (var 目前裝的東西是0)接下來是
var = 1 + 1; (var 目前裝的東西是1)再來是
var = 2 + 1; (var 目前裝的東西是2)
...

所以最後得到的結果會是 var = 10 這個答案。

For 的運用在一些基本進出場邏輯是不太會用到的…不過卻在很多的函數裡面會出現。當未來你需要拆解函數的時候,還是需要了解這個 For 迴圈的。

以上的介紹希望大家對 For 迴圈有一個基本的了解。下一篇將介紹函數的運用。

2010年2月7日 星期日

最重要的指令和第一隻程式

在這篇將會介紹一下我認為最重要的指令 Print 和來寫寫到目前為止的第一隻程式吧。首先是 Print 到底有什麼重要性?在往後寫程式的過程中…你將會遇到非常多問題…而這些問題通常你是不知道錯誤在什麼地方的,也許只是某個變數值忘了加 1,也許是某個計算指令根本就寫錯了等…所以抓蟲(bug)是一件很痛苦的過程,這時候 Print 的指令就相當重要了。

Print 其實就是把資料印出來…印在 PowerEditor 下方的 Bebug 視窗而已。他的程式語法加下:

Print(數值);


寫程式的過程中抓 bug 是一件非常令人討厭的事情…因為抓到後來說不定只是一個加號你打成了減號這種很笨的事而已。而利用 print 指令能夠讓你一步一步的找到你程式中的問題出在什麼地方。

了解了 Print 的用法後…我想就讓大家來寫寫第一隻程式。通常教程式語言的書籍第一個程式都會是讓學習者寫一個 Hello World! 的程式…所以這邊也不免俗的來讓大家寫寫 Hello World! 吧。

用上了上一篇所教的 if 來作的話,可以寫成這樣:

If LastBarOnChart then
print("Hello World!");


新增一個 signal 後,把上面程式碼打上去,接著檢查完成後放到 K 線圖上。然後回到 PowerEditor 下面看看是不是有出現這行字:



有的話…代表你的第一隻程式成功了。

這邊用到了一個函式叫作 LastBarOnChart ,它的意思就是 K 線圖上的最後一根 K 線,當然你可以連 If 的判斷都省略掉…不過你將會看到一堆的 Hello World! 出現在 Debug 的視窗上。

當然 Print 這個指令也可以一次印出很多的資料:

Print(數值1, 數值2, 數值3, 數值4, ...);


只要用逗號分開就行了。 Hello World! 完成後…請學著用 Print 印出一些資料來看吧。也許你可以印出每根 K 線的高點(high) 或是收盤價(close) 等。總之…多寫寫囉。

基本邏輯判斷

接下來這個主題可以算是程式交易最為重要的地方,那就是邏輯判斷式子和迴圈的運用。通常策略要進場前總是會需要判斷一些條件(當然也可以什麼條件都沒有),然後依照判斷條件的結果去執行。所以這邊提到的會是 if ... 的運用。


首先看一下 EasyLanguage 裡面對 if 的幾個用法,我順便用中文舉個例子:

If 突破三日高點 Then
買進;

上面的程式碼翻成中文就會變成:假如(if)突破三日高點然後(then)買進

另外一個用法是:

If 突破三日高點 Then Begin
買進;
記錄三日低點;
End;

上面的程式碼翻成中文是:假如(if)突破三日高點然後(then begin)買進、記錄三日低點,結束(End;)

二個例子的差別在於第一個例子並沒有用到 Begin 和最後的 End;

那什麼時候需要 Begin 呢?簡單的說…只要你的判斷式後面所需要執行的命令只有一行的話,那你就可以偷點懶…少打一些程式碼,不需要加上 Begin... End;

不過如果你需要執行的命令是二行以上的話,那就需要加上 Begin...End; 了。

接下來再 if 的判斷部份還有一個是偶爾會用到的,會像下面這樣:

If 突破三日高點 Then Begin
買進;

End
Else Begin

睡覺;
End;

這個部份翻成中文為:假如(if)突破三日高點然後(then begin)買進否則(end else begin)睡覺,結束(End;)

簡單的說會是一個 if ... else ... 的程式語法,也就是當假如(if)成立的時候去作某一些事,當假如(if)不成立的時候去作另外一些事。

在這個 if ... else 的語法部份…請特別注意分號(;)標示的部位,常常會有寫錯的時候…哪邊後面該加分號…哪邊又不該加…它是有固定的用法的,在第一個 End 後面是不加分號的,不然程式在檢查的時候可是會出錯的。

通常 if ... else 的程式都可以拆開成二個 if 來判斷…像上面的例子就可以拆開成:

If 突破三日高點 Then Begin
買進;
End;
If 沒有突破三日高點 Then Begin
睡覺;
End;


在判斷的過程中…你可以加上很多的條件…只要利用 And 把他們接起來就行了:

If 突破三日高點 And 收盤價大於月線 And 時間小於一點 Then Begin
買進;
End;


2010年2月5日 星期五

基本數值運算

上一篇介紹了變數的宣告…接下來的部份就是針對變數去作運算了。運算就如同小學生寫數學題目一樣…只要把你要運算的數學式子一行一行的寫出來就行了。例如你要讓某個數值等於 2000 + 800 那就這樣:

var = 2000 + 800;

可以說一點難度都沒有。


接下來除了自定的變數外…能用到的資料有哪些呢?不外乎一開始提到的每根 K 線的開、高、低、收、量和時間,所以如果你需要 5 根收盤價的均價,那該怎麼寫呢?首先你要知道均價的計算方式。

均價的計算方式其實就是平均價,所以只要把每個價格相加起來…除以幾根 k 就行了。有了這樣的想法之後…就可以很容易的寫出下面的程式:

var = (close + close[1] + close[2] + close[3] + close[4]) / 5;

在這邊的中括號所代表的就是前 x 根 k 線的資料,而 close 代表的就是 k 線的收盤價。如果沒有接上中括號的話…那代表的就是當前的這根 k 線,接上了 [1] 就代表著當前這根 k 線的上一根 k 線。

所以上面的運算式子代表著我先把目前這根 k 線的收盤價 + 上一根 k 線收盤價 … 一直加到第四根 k 線的收盤價後,得到的總合再去除以 5 。

這樣…就可以得到我們所需要的 5 根 k 線的均價了。

在數值的運算的這個部份就是運用加、減、乘、除得到所需要的資料罷了。所以只要大家懂得怎麼按計算機…我相信這個部份對大家來說應該都是完全沒問題的。

2010年2月4日 星期四

變數的宣告

在每一個交易程式的最上方…通常就是宣告變數的程式碼。大部份交易策略用到的宣告有三種:

input
var
array

在程式內所有用到的非保留字變數…都需要事先宣告過後才能使用。除非你是使用像 Value1 、 Value2 等系統預先幫你宣告的變數。

強烈建議大家在寫策略的時候不要使用 Value1、Value2 等的變數,請花點時間幫這些變數取一個你很容易懂的名字。

例如以抓三根 k 線高點的程式語法來說:

Value1 = highest(high, 3);



highOfThreeBars = highest(high, 3);


也許第二種寫法會讓你多花很多時間在打字上面…不過請相信我…除非你寫出來的策略讓你覺得是垃圾,以後不會再打開他出來看,不然多花點時間打字對你以後修改程式會有很大的幫助。

三種變數的宣告語法如下:

inputs: length(10);
vars: highOfThreeBars(0);
array: lowOfThreeBars[3](0);


首先, input 和 var 的宣告都是: 變數的名字(預設值),input 和 var 的差別就是 input 的預設值是不能在程式碼內去修改的,也就是如果你宣告了一個 input: length(10); 接著又在程式碼內寫下了:

length = 11;

這樣是會有錯誤的。

使用 input 的好處是你可以不用進到 PowerEditor 內去修改這個變數的值,而可以直接在套用該策略的 k 線圖上直接修改他的值。如下圖:


你可以直接在些修改 input 的值,當然,input 這個值也可以拿來跑最佳化。
關於這部份可以參考之前寫過的文章:

TradeStation 參數的更改方式
TradeStation 最佳化過程教學


接下來是 vars 和 array,把變數宣告成 vars 則可以自由的在程式內運用。尤其是寫策略寫到後期後…變數的用處將會愈來愈多。變數不再只是存個數值等著運算,它還可以用來存狀態、存條件等。

array 則是陣列…array 的宣告會包含一組中括號[],中括號內的數值代表著 array 的長度,也就是宣告了一個 array[3](0) 代表著你可以使用的變數有:
array[0], array[1], array[2] 等三個變數。

通常不太有人會用到 array,那什麼情況下會用到 array 呢?我在第一篇文章中提到過,程式是每一個 tick 都會整個執行過一次…所以假如你寫到了這樣的程式:

length = length + 1;


程式在執行的時候就會每一根 k 線都把 length + 1,但是有時候你又不希望程式自動的幫你這個變數的數值一直修改。例如我在:程式交易 - HTS RSI 多週期計算方式 內寫的程式。我運用了 array 存下了每隔 15 分鐘的收盤價,在這邊如果要運用 vars 來達到我想要的目的…可能就不太容易了。


在這邊順便提一下變數的用法。當你宣告了一個變數後,每根 k 這個變數都會有一個值,所以如果你想得到 10 根 k 線前這個變數的值的話,就可以用:var[10] 來得到 10 根 k 前這個變數的數值是多少。

最後…這篇似乎沒什麼可以讓大家練習的題目…那就隨便宣告幾個變數後檢查看能不能通過吧..:p

了解 EasyLanguage 的運行方式

這是 EasyLanguage 教學文章系列的第一篇。我想先跟大家聊聊交易策略在 TradeStation 到底是怎麼在執行運算的。

當一個策略程式完成的時候,他就像一篇文章一樣。電腦會從第一個字一直去讀到最後一個字,在每一個 tick 讓 K 線跳動的時候,整個程式就會從頭到尾被電腦讀一次,並去判斷是否有條件符合的狀況。


交易策略再說簡單一點…其實就是只有用幾個數值在作運算而已,大部份使用到的就只有每根 K 線的時間、開、高、低、收和量。

不管你是用指標也好、價格突破也好,通通都是從這些數據運算出來的。

在前面提到了程式像文章一樣,所以程式內容的先後順序是會引響到整個結果的,你把某一段文字寫在開頭,跟把這段文字寫在結尾,人閱讀起來會有差別…當然電腦閱讀起來也會有差別的地方。

如果一個判斷是需要某個數值的結果,那如果你把運算這個數值的文字寫在判斷的後面,那麼出來的結果就會是有問題的。舉個例子來說:


假如今天下雨,我需要帶雨傘。

今天會下雨





今天會下雨

假如今天下雨,我需要帶雨傘。


這兩者出來的結果並不會相同。以第一個例子來說,程式先跑到了"假如今天下雨,我需要帶傘",接著程式並不知道今天有沒有下雨,所以他去抓了下雨這個變數後得到的可能是"昨天沒下雨"(前一根 K 棒的值),然後你得到的結果就是今天不用帶傘。

也就是說在你沒帶傘出門後,才發現原來今天下雨的時候已經太遲了。

下一篇將會開始作程式撰寫的教學。

程式交易 - EasyLanguage 教學

最近稍為閒下來了。所以大概有時間寫這一系列的東西。從事程式交易到目前…時間大概是 19 個月左右。在這段時間內…除了自己寫的策略外…也幫不少朋友從事策略代工的事。我想寫過的策略應該有破百隻了吧。基本上我還是覺得策略應該要自己動手。這樣你才會知道到底哪邊出了狀況,也更容易了解策略哪邊還可以改進。不過大概有不少人覺得寫程式是一件很困難的工作…或是不知道該怎麼入門。我想這也是這系列文章主要的地方。

在這系列裡面…我會慢慢的把寫程式的一些技巧提供給大家作為參考。在 Blog 右邊的標籤也會新增一個 1.6 EasyLanguage 教學 的項目。

日後有這方面的文章都會放在這個項目裡。有興趣慢慢學習怎麼寫程式的朋友大概可以參考看看。當然…我不確定這系列的文章更新速度是不是會很快。大概得看我自己時間上面是不是可以挪的出來了。
Related Posts Plugin for WordPress, Blogger...