200506280142TS2000i交易系統開發123──VIDYA(彈性指數動態平均)壹

TS2000i交易系統開發123──VIDYA(彈性指數動態平均)

開場白:從一個閃過腦海的念頭開始

  從這篇開始,我們進入中級的課程。我嘗試用一個『空白』的角度,從零開始一步步的從無到有建立起一套完整的交易系統;到最佳化系統與報表評估。當然我採取的是呈現事實的角度,而不是提供一套保證獲利的系統。如果你是喜歡與期待有人把飯煮好並拜託你吃的;孩子、長大些、成熟些!天下沒有白吃的午餐。

  像每一個人的過程一般,我們從一個交易概念開始出發。也許你看了我的文章『使用Vidya 概念強化你的F1賽車』,覺得VIDYA是個不錯的新概念指標,但不知道開發成交易系統會如何呢?於是、、你打開了TS2000i開始一段探索之旅。

  首先、我們一般會先寫成指標功能,方便我們先『面試』一下,未來我們也可以拿來核對訊號使用。我們要把核心VIDYA的運算寫成一個函式(User Function),因為我們會在『指標』、『Paint Bar』、『Show Me』與『交易訊號』裡重覆呼叫使用。這個函式應該會是長的像這樣:

{  User Function Name : SS_Vidya  }

Inputs: Length(NumericSimple), Smooth(NumericSimple);

Vars: Up(0), Dn(0), UpSum(0), DnSum(0), AbsCMO(0), SC(0);

Up=IFF(Close>Close[1], Close-Close[1],0);

Dn=IFF(Close

UpSum=Summation(Up,Length);

DnSum=Summation(Dn,Length);

AbsCMO=AbsValue((UpSum-DnSum)/(UpSum+DnSum));

SC= (2/(Smooth+1)) * AbsCMO;

If Currentbar=Length then SS_Vidya=Close;

If Currentbar>Length then SS_Vidya=(SC*Close)+((1-SC)*SS_Vidya[1]);

  首先我們要像RSI計算一樣,把今天收盤高或低於昨日分開記錄並予以加總。UP變數記錄今天比昨天收高的部份,DN記錄下跌。這裡我們使用一個到處看得到的判斷語法『IFF』(LotusExcelMetaStock都有)文法如下:

IFF ( 判斷式,為真處理式,為偽處理式 );

Up=IFF(Close>Close[1], Close-Close[1],0);

Up變數=IFF(如果今天收盤>昨日收盤,成立的話Up為今收減昨收,不成立的話Up代入零);

Dn=IFF(Close

Dn變數=IFF(如果今天收盤<昨天收盤,成立的話Dn為今收減昨收的絕對值,不成立的話Dn代入零);

  其實上式可以寫成:

Dn=IFF(Close

  但是我故意這樣做想來跟你介紹另一個常用的數學函式『AbsValue絕對值』。經過絕對值函式運算,我們只會得到正數不會出現帶負號的數字。比如我們寫AbsValue(3) AbsValue(-3) 我們都將得到『3』。

  過來我們會常常用到『總和』的運算。Summation就是提供如此的功能運算函式。所以我們的UpSum記錄幾天的收盤上漲總和,而DnSum記錄的是幾天的收盤下跌總和。

UpSum=Summation(Up,Length);

DnSum=Summation(Dn,Length);

  Summation必需代入兩個參數,加總的數據(Up)與加總個數(Length)。如果我們要算9天的收盤平均,可以這樣處理;

Summation(Close, 9) / 9 ;

  我們在AbsCMO又再使用了AbsValue函式一次,之後巴拉巴拉的應該大家都看得懂吧?不懂的話請跳回前面初級重修。沒問題就按F3編譯後繼續看下去。

  完成核心函式後,我們開始寫我們的指標功能。

{

Indicator Name : SS_Vidya

Chande's Variable Index Dynamic Average (VIDYA)

}

Inputs: Length(21), Smooth(5);

Value1 = SS_Vidya(Length, Smooth);

If Value1 > 0 then begin;

Plot1(Value1, "VIDYA");

End;

  這一段應該沒問題,寫完直接按F3編譯。好囉,你應該可以在TS2000i裡呼叫像以下的圖形:

  如此,我們看到我們的交易構思慢慢的完成。

這篇文章留言功能有問題..請在別的文章留言..謝謝

以下是留言非本文..

1.已修正,應該是複製時出了問題。謝謝抓蟲!

 

2.一些訊號問題我後面都會提到,這位同學我們這裡沒有資優跳級的!嘿嘿!不過你的這段語法,有些明顯的邏輯錯誤與文法修正的須要。

 

IF Condition1=True then Buy("") this bar at Market lowest(low,10) Stop

 

首先、Condition1不須加=TRUE;如果你的結果是取真值的話。所以你只要寫這樣 If Condition1 Then ……. 。其次你真的不能跳級,因為我前面有談及,EasyLanguage中關於今天你能做的壞事只有收盤成交,at Close (收盤買進或賣出)沒有其他的指令可以使用。所以你的This Bar at Market是禁止的。再來、既然你已經使用Market了,就不可能再有後面的設價敘述。所以我不知道你這個指令的確實意圖?如果照你後來的解釋,我們也不可能設定一個停損買進是在我們現在的市價之下的,因為那將會被直接執行。所以我能想到的是以下幾種可能,你參考看看:

 

If Condition1 Then Buy Next Bar at Market ;  條件一被滿足,明天市價買進。

If Condition1 Then Buy This Bar at Close ;  條件一被滿足,今天收盤價買進。

If Condition1 Then Buy Next Bar at Lowest(Low, 10) ; 條件一被滿足,明天在最近10日低價限價買進。

If Condition1 Then Sell Next Bar at Low(Low, 10) Stop ; 條件一被滿足,明天在最近10日低價停損賣出。

 

所以我勸你打好基礎,有耐心點慢慢看下去。一般我們需要瞭解的語法與技巧我都會提及的。

 

回應
    沒有新回應!





Powered by Xuite