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

2010年1月31日 星期日

程式交易 - HTS RSI 多週期計算方式

在之前的收費課程內提供給大家一個 TradeStation 的多週期 RSI 程式。接著…有學員希望能把這隻程式轉成 HTS 版本…然後運隆就交到我手上了。

程式可以說是有不少的難度要克服…畢竟在 HTS 內寫多週期的程式並不像 TradeStation 內這麼容易。所以也花了一點時間。

原本的 TradeStation 程式用到了下面三行指令:

RSI(close, 9)
RSI(close of data2, 9)
RSI(close of data3, 9)


這邊的三個週期分別是 5 分、15分和 60 分…

接著來看看這短短的三行 TradeStation 程式在 HTS 會變怎麼樣…


Variables: SumUP(0), SumDN(0), Counter(0), UPSize(0), DNSize(0), AvgUP(0), AvgDN(0) // 15 RSI
Variables: SumUP60(0), SumDN60(0), Counter60(0), UPSize60(0), DNSize60(0), AvgUP60(0), AvgDN60(0) // 60 RSI

vars:RSI5(0), RSI15(0), RSI60(0)
array:close15[9](0), close60[9](0)

if mod(time/100, 100) = 0 or mod(time/100, 100) = 15 or mod(time/100, 100) = 30 or mod(time/100, 100) = 45 then
for Value1 = 8 to 1 step -1
close15[Value1] = close15[Value1 - 1]
end for
close15[0] = close
end if

if mod(time/100, 100) = 45 then
for Value2 = 8 to 1 step -1
close60[Value2] = close60[Value2 - 1]
end for
close60[0] = close
end if

RSI5 = RSI(close, 9)

/* 15 RSI */

IF CurrentBar = 1 Then
SumUP = 0
SumDN = 0
For Counter = 0 To 9 - 1
UPSize = close15[Counter] - close15[Counter+1]
If UPSize >= 0 Then
DNSize = 0
Else
DNSize = UPSize * -1
UPSize = 0
End If
SumUP += UPSize
SumDN += DNSize
End For
AvgUP = SumUP / 9
AvgDN = SumDN / 9

Else
UPSize = close15[0] - close15[1]
If UPSize >= 0 Then
DNSize = 0
Else
DNSize = UPSize * -1
UPSize = 0
End If
AvgUP = (AvgUP[3] * (9 - 1) + UPSize) / 9
AvgDN = (AvgDN[3] * (9 - 1) + DNSize) / 9

End If

If (AvgUP + AvgDN) <> 0 Then
RSI15 = AvgUP / (AvgUP + AvgDN) * 100
Else
RSI15 = 0
End If


/* 60 RSI */

IF CurrentBar = 1 Then
SumUP60 = 0
SumDN60 = 0
For Counter60 = 0 To 9 - 1
UPSize60 = close60[Counter60] - close60[Counter60+1]
If UPSize60 >= 0 Then
DNSize60 = 0
Else
DNSize60 = UPSize60 * -1
UPSize60 = 0
End If
SumUP60 += UPSize60
SumDN60 += DNSize60
End For
AvgUP60 = SumUP60 / 9
AvgDN60 = SumDN60 / 9

Else
UPSize60 = close60[0] - close60[1]
If UPSize60 >= 0 Then
DNSize60 = 0
Else
DNSize60 = UPSize60 * -1
UPSize60 = 0
End If
AvgUP60 = (AvgUP60[12] * (9 - 1) + UPSize60) / 9
AvgDN60 = (AvgDN60[12] * (9 - 1) + DNSize60) / 9

End If

If (AvgUP60 + AvgDN60) <> 0 Then
RSI60 = AvgUP60 / (AvgUP60 + AvgDN60) * 100
Else
RSI60 = 0
End If



你沒看錯…就是會變這麼一大串…這還沒包含原本在 TradeStation 內可以隨意調整 RSI 的參數…在 HTS 要調整的話…那…可能又得花上很多的時間去做程式的內的調整了。

所以…如果你想在 HTS 內玩多週期的策略,那也許你得先把你的程式功力再往上提升不少才可以囉。

8 則留言:

  1. DK大你好~

    很感謝你在這裡持續提供這麼多的教學~
    小弟我有一個語法上的問題想請教您~

    假設我有A B C D四組買賣訊號
    設定TS/HTS允許加碼一口~
    因此可能會有AB AC AD BC BD CD這幾種
    兩種不同訊號同一天出現的複數倉位
    也可能有AA BB CC DD這幾種一種訊號
    一天重複出現兩次的情況~

    但是如果我只想要避免AA的出現
    允許BB CC DD AB AC AD BC BD CD等
    請問這樣該怎麼寫才行呢~??

    先感謝DK大的指導啦~!!

    回覆刪除
  2. Kersey: 看來只需要限制 A 訊號只能在空手的時候進場就行了。除非你可以允許 BA 的情況..那就用一個變數去記錄一下..如果 A 訊號進場就把變數設 1,然後在 A訊號進場前檢查一下這個變數是不是 1 就行了。

    回覆刪除
  3. OK, 去試試看~
    感謝版大!

    回覆刪除
  4. DK您好:
    有提到換日用 if Date<>date ....then begin....end;

    而如果只想在 每個月的(一)月初(1-10)做交易,如何在程式裡做變數宣號。

    祝你新年快樂、身體建康、發大財。

    回覆刪除
  5. frasandy: 可以試試 mod 函數…
    if mod(date, 100) <= 10 then
    ...

    回覆刪除
  6. 謝謝您的回答,祝您虎年行大運

    回覆刪除
  7. DK大你好~

    很感謝你在這裡持續提供這麼多的教學,看到這個解答想要問一下,如希望要在30分線中的RSI 可以看到 RSI 的週線,不知要如何處理才行,如果知道煩請告知一下,Thanks

    回覆刪除
  8. 原慶:請參考多週期策略的寫法,利用二個 symbol 就行了。

    回覆刪除

請留下您的大名…匿名者恕不回應…

Related Posts Plugin for WordPress, Blogger...