最近終於把 Tradestation 搞定了,才發現原來回測 2000 根 k 線真的很少很少很少…
這幾天裡面又寫了幾個程式,回測一年的結果都不錯的情況下,把回測的時間加到兩年、三年,就會發現結果完全不同了…所以說,當沖程式實在是不容易寫出來…只能繼續再把腦袋裡的想法繼續挖出來試試了。
來講講怎麼把 HTS 的程式碼轉成 Tradestation。其實真的沒多大差別,很多東西都是一樣的,也可以看出來 HTS 抄 Tradestation 抄得多兇了…
首先,如果 HTS 的程式裡有用到參數的(parameter),在 Tradestation 裡請改成 input:
parameter:aaa(50) → input:aaa(50);
在每行程式碼的結尾加上分號(;):
aaa = aaa + 100 → aaa = aaa + 100;
如果有用到 if 的地方,HTS 的寫法為:
if (aaa < 100) then
…
end if
請改為:
if (aaa < 100) then begin
...
end;
也就是在 then 後面都加上 begin,然後在結束的地方把 if 拿掉並加上分號
另外,如果有用到 else if 的,HTS 的寫法為:
if (aaa < 100) then
...
else if (bbb > 100) then
...
end if
同樣的,在每個 then 後面加上 begin,並且每個 if 的結束加上 end,比較重要的是,中間的 end 是不用加分號的,分號只加在最後一個 end 後面:
if (aaa < 100) then begin
...
end
else if (bbb > 100) then begin
...
end;
接著,有用到時間的地方…HTS 的寫法為
time = 100000
TS 的寫法為
time = 1000.00
就這樣了,把你的程式碼丟進 Tradestation 裡有 99% 可以用了,剩下的 1% 大概是用到只有 HTS 有的函數,這樣的東西把功能打進字典查一下,應該都還是找的到對應的 Tradestation 函數可以用…
所以說,HTS 轉到 Tradestation 根本就是無痛升級了…好好的回測自己的程式吧!!
請問前輩
回覆刪除我的HTS程始碼要轉到TS
Condition用到1~999
檢查時到Condition100就出現錯誤訊息
請問是TS的限制嗎?
小壓
嗯..我記得 condition 是不能超過 99 的...不過你用到 1~999 啊...也許有些一樣的東西可以和在一起吧...
回覆刪除感謝前輩指教
回覆刪除另外還有一個問題
在轉HTS 2 TS
"Step" 與 Exit f3檢查發生錯誤過不去.
查字點也無解,
input: Length(3), Times(2.5);
Variables: DownTrend(True), Counter(0);
Condition1 = Hammer(Times, Open, High, Low, Close);
DownTrend = True
For Counter = Length To 1 Step -1
If Low[Counter] < Low[0] Then begin
DownTrend = False
Exit For
End;
End For;
If DownTrend And Condition1 Then begin
End;
小壓
感謝前輩指教
回覆刪除另外還有一個問題
在轉HTS 2 TS
"Step" 與 "Exit" f3檢查發生錯誤過不去.
查字點也無解,是否前輩有遇到過這類似問題的經驗教導後輩...感恩!
input: Length(3), Times(2.5);
Variables: DownTrend(True), Counter(0);
Condition1 = Hammer(Times, Open, High, Low, Close);
DownTrend = True
For Counter = Length To 1 Step -1
If Low[Counter] < Low[0] Then begin
DownTrend = False
Exit For
End;
End For;
If DownTrend And Condition1 Then begin
End;
小壓
這程式碼是 HTS的HAMMER槌子
回覆刪除是否是因為TS缺乏HTS"函數"的因故?
小壓
TS 似乎...沒辦法用減的方式跑 for..也許要改個寫法喔..一次加一..另外也沒有 exit for 可以用..這得要另外用別的方法達成...比如說你在 exit for 的地方改成 length = 結束 之類的..如果你後沒用到 length 的話這是可行的..
回覆刪除D.K大
回覆刪除我在把HTS轉TS語法中遇到問題,一直顯示這部份有問題,但程式不大懂的我又看不出問題點,我哪個部份要改才會過呢?請D.K大指點
感謝指點
david
input:
Price(close),AvgLength(20),stop1(125),top(0.04),AA(40);
Vars: El(0),Es(0),close1(0),high1(0),low1(0);
if date[1] <> date[0] then begin
IF TIME=1345.00 THEN begin close1=CLOSE; END;
high1=close1*(1+top);
low1 =close1*(1-top);
value0=(close-lowest(low,3))/(highest(high,3)-lowest(low,3))*(100);
value1 = 2/3*value1[1 +(1/3*value0)
value2 = 2/3*value2[1]+value1*1/3;
value3 = 3*value1 - 2*value2;
value4 = MACD(Close,4,44);
value5 = XAverage(Value4,5);
value6 = Value4 - Value5;
david: 你填的程式碼不太完整的感覺..目前看到的錯誤有
回覆刪除if date[1] <> date[0] then begin
IF TIME=1345.00 THEN begin close1=CLOSE;
END;
end;
這邊少了一個 end
另外 value1 = 2/3*value1[1 +(1/3*value0);
最後少了一個分號...
D.K大
回覆刪除感謝指點
感謝 D.K大的幫忙
試用下單機真的很不錯 , 給一些使用者回應 , 因為日上最近要收費 所以很多使用者都打算轉台 一樣要付費 乾脆找更好的 但是因為用日上久了 應該有不少人會拿來比 , 可以參考一下喔
回覆刪除1. 策略倉位改變時, 可否加上當時價位,這樣才可以比較成交價位有沒滑價太多?
2. 畫面無法伸縮耶 加上整體畫面實在很大, 如果要看下單機就會佔了螢幕不少地方, 有時只是想確定它是否活著, 能否在視窗title的地方顯示價位跳動, 也讓畫面能伸縮一下呢
3. 看到選擇權的欄位, 有計畫發展選擇權下單嗎? 以我的需求是 比如跌破期貨某重要價位 就進場SC, 突破期貨某價位就進場平倉停損, 另外怕OP成交在離譜價位, 可否設一range, 最高或最低價位不得超過XXX 作保護, 大概就是醬, 感謝您的努力
jojo: 謝謝你的支持…關於你的意見…
回覆刪除1:帳戶進場的時候會抓到策略改變時的價位…並填寫在進場價內喔
2:畫面縮放的話…會讓整個下單機畫面變的很醜..XD...我再考慮一下...另外你提到的 title 跳動價格的部份..比較沒辦法..因為是多策略的..所以有時候商品並不會只有一種..
3:會準備加入選擇權的部份..你所說的 range 應該就是限價單的功能吧?
jojo: 關於第三點..現在想到選擇權似乎只能丟市價單..因為不知道目前選擇權的價位..你所說的功能應該是要自己設定價位的上限值吧..我會加進去的..
回覆刪除D.K大
回覆刪除小弟有一ts轉hts程式 出現create error?
可麻煩DK大幫我看看哪裡沒寫正確(這是macd修正每日開盤跳空) 感謝
vars:jumpdiff(0),mclose(0),closeOfD1(0),openOfD0(0)
Array:CoD[84](-1),OoD[84](-1)
Parameters: FastMA(10),SlowMA(20),MacdMA(9)
variables:value1(0)
value1=MACD(mclose,FastMA,SlowMA)
jumpdiff=closeOfD(1,Cod)-openOfD(0,OoD)
if time[0] < > time[1] then mclose=close+jumpdiff
print(date,time,time[0],time[1],closeOfD(1,Cod),openOfD(0,OoD),close,jumpdiff,mclose)
end if
if (value1 cross over EMA(value1,MacdMA)) and close >= open then
buy("買進") next bar at market
End if
If (value1 cross below EMA(value1,MacdMA)) and close < open then
sell("賣出") next bar at market
End if
請問板大
回覆刪除我程式除錯 但verify出現錯誤訊息:The word END was expected before end of file?(我最後一行是End;)請問是哪裡沒寫正確? 感謝
james: 看起來是程式內某個地方少了個 end; 喔...檢查一下吧..
回覆刪除系統是一行一行幫我除錯的 一直到最後一行都除好錯了 就是剩最後一個 錯誤 改不掉?
回覆刪除james: compiler 不會知道前面還後面的..它只知道從頭到尾少了一個 end; 所以才會在最後一行跟你說少了一個 end;
回覆刪除不然你算一下囉 .. 有一個 begin 就要有一個 end 對應喔..
找到問題了 感謝!
回覆刪除請問板大 如何讓跑performance 時wait for data 能出現在run的數字 讓user可確認程式沒當掉?感謝
回覆刪除james: 這個沒辦法耶…把 k 線開少一點囉…有時開太多會當掉是沒錯…
回覆刪除請問板大 在TS:
回覆刪除UpBand = BollingerBand(Close,Length,StdDevUp)
DnBand = BollingerBand(Close,Length,StdDevDn)
bollinger band函數
那在HTS 應如何改寫?感謝
感謝大大指導
回覆刪除請問板大
回覆刪除dmi策略: di+ di- 黃金交叉及死亡交叉, when adx(14)>25 等語法 在hts要如何表達?感謝指導
james: 布林和 dmi HTS 都有內鍵…直接用就行了…你可以參考指標的算式…套用在策略裡。
回覆刪除Draw2( Round( MinusDI(Length),3), "-DI", Blue)
Draw1( Round( PlusDI(Length),3), "+DI", Red)
請問板大 我是這樣寫//dmi
回覆刪除parameter: adxx(14),len(14)
value1=(plusdi(len))
value2=(minusdi(len))
condition4=value1-value2>0
condition5=value1-value2<0
if condition4
then
buy("買進") 1 contract next bar at market
end if
...............
可是只出現一次交易? 請幫忙除錯 感謝
修正
回覆刪除if condition4 and ADX(adxx)>25....then....
我有print value1(plusdi) value2(minusdi) and adx, 但adx正確 value1 and value2卻與di+ di*線圖數值不合?
回覆刪除james: Round( MinusDI(Length),3)
回覆刪除你有加上 Round 嗎?
另外買賣的部份把 1 contract 拿掉試試囉..
DK大您好
回覆刪除我有加round,拿掉one contract 還是與D+ D-數值不符?
james: 你指標內的 length 和策略內的 length 是一樣的嗎?..應該是不可能數值不一樣才對..
回覆刪除感謝大大 我再檢查看看!!
回覆刪除另請問 若我要 寫一策略:
"當(長)30分線買(賣)訊號出現時 則(短)10分線只買進及平倉(賣出及平倉)" 用hts or ts語法 要如何寫? 感謝
james: 不好意思…目前我還沒寫過不同時間週期的策略耶…也許你要用到 data 這個東西了…
回覆刪除大大 您好 我是 david
回覆刪除請問 以下HTS 要如何翻成TS?
lowd = LOWofd(1, lowarray)
highd = HIGHofd(1, higharray)
closed = CLOSEofd(1, closearray)
UpBand = BollingerBand(Close,Length,StdDevUp)
回覆刪除DnBand = BollingerBand(Close,Length,StdDevDn)
請問大大 在HTS 裡 上面要怎麼改 ?
我實在不知道該怎麼改
david: TS 裡面直接使用 lowd(1), highd(1), closed(1) 即可
回覆刪除Judy: 請參考 HTS 內的指標 BollingerBands…裡面的 Value1 和 Value2 就是你要的東西了..
請問DK大,
回覆刪除MinusDI和PlusDI在TS的相對函數名稱是什麼?
cswu: DMIMinus 跟 DMIPlus …試試看囉
回覆刪除D.K大您好~~
回覆刪除又來問你笨問題了- -"
在TS上寫出策略轉到HTS後~~
比較兩個的回測數據
每個月的獲利,不一樣耶@@
而且有些相差蠻多的..- -
照理來說 應該是要一樣吧...
那是不是說 我寫錯了....>"<
Tai: 如果差異真的很大的話…那應該就是寫錯了…如果有用到技術指標的話…需要把技術指標的資料 print 出來慢慢對了…
回覆刪除Inputs: Lenght(numeric);
回覆刪除Variables: CMO_1(0), CMO_2(0), CMO_Final(0);
If Close > Close[1] then begin
CMO_1 = Close - Close[1];
CMO_2 = 0;
end
Else begin
CMO_1 = 0;
CMO_2 = Close[1] - Close;
End;
Value1 = Sum( CMO_1, Length);
Value2 = Sum( CMO_2, Length);
CMO = ( Value1 - Value2 ) / ( Value1 + Value2 ) * 50 + 50;
卡在Length不是ts語言不知要怎更改呢 感謝
這個你應該隨便開一個內建的 function 出來看就會有參考了才對…
回覆刪除試試 input: Length(numericsimple);
我使用HTS4000~程式碼裡有Date[1]<>Date[0],要用在夜盤跨日好像不能用~要改成什麼語法~懇請告知~謝謝!!
回覆刪除我使用HTS4000~程式碼裡有Date[1]<>Date[0],要用在夜盤跨日好像不能用~要改成什麼語法~懇請告知~謝謝!!
回覆刪除