[***API下單機收費公告***] [API下單機下載] || [TS懶人包] [雅虎拍賣]
2009年11月10日星期二

程式交易 - Q_Time 用法

0 回應

首先要說明的是 Q_Time 只有最後一根 K 線有時間… Q_Time 代表的時間為系統目前的時間…除了最後一根即時 K 線外… Q_Time 的時間都為 000000。這個部份可以用在出場或進場。因為如果要確時的買在 next bar 的話…如果訊號成立在收盤前的最後一根 K 線…那再 next bar 下去就到隔天開盤了。

首先看看老史的文章:


13:43平倉 15K最終改良版!

本來想改成13:30平倉,回測少賺一點省得麻煩,結果改成13:30分用TS回測成績少了40萬....是因為我留倉的部位是由最後收盤價決定...早 15分鐘去決定要不要留倉...,留倉單的勝率及獲利部位會減少很多...所以最後想了一個辦法,經過不斷實驗,解決我所有的煩腦~~~不過還是得實際跑才知道有沒有其他side effect...

//當下k棒時間在13:43的時候平倉訊號出現 Q1 or Q2,等到q_time>134400,此訊號消失由下面的T1 or T2接手
IF q_TIME>134300 and q_time<134400 AND MarketPosition<>0 then
if marketposition=1 then
ExitLong("Q1") this bar at market;
end if
if marketposition=-1 then
exitshort("Q2") this bar at market;
end if;
End if;

//當下k棒時間過了13:44分,Q1 or Q2消失,T1 or T2接手發出平倉訊號
//(OR q_TIME=000000 這部份可兼顧回測歷史k棒)
IF TIME = 134500 AND (q_TIME>134400 OR q_TIME=000000) THEN
EXITLONG("T1") THIS BAR AT MARKET
EXITSHORT("T2") THIS BAR AT MARKET
end if;

這樣就可以了嗎? 不...這樣可能會有個問題...就是在Q1/Q2消失 到 T1/T2出現的極短期間,有可能發生倉位會變化(平倉=>新倉=>平倉),所以最後輸出到signal.txt時還要再加一段程式碼避免這種情況發生:

//簡單說就是在13:44分之後,有可能發生倉位變化的期間,不將結果寫入signal.txt
/*********信號寫入檔案 signal.txt********/
if date = lastcalcdate and time = LastCalcTime
and (q_TIME<134400 or q_Time >134450) then
FileDelete("C:\danRC15\signal.txt")
FileAppend("C:\danRC15\signal.txt", ("0,"+ NumToStr( Date, 0 ) +","+ NumToStr (Q_time,0)+","+ NumToStr(CurrentContracts,0)+",0,"+NumToStr(close,0)+",1"))End if
/*********先信號後下單程式結束*********/

好了,這樣子就把原先在開盤時,訊號換手的問題解決,以後可以安心的在開盤前將HTS、下單機通通開好等著開盤,接著印鈔。這篇寫得亂七八糟應該沒有人看得懂吧 XD


這樣就解決出場的問題了…至於進場的話…目前的想法也是類似。

不過是在 Q_time = 134300 的時候判斷條件是不是成立…如果成立的話把某個變數修改為某個值…類似這樣:


if Q_time > 134300 and Q_Time < 134400 and dayEndCheck = 0 and xxx then
buy this bar at market
dayEndCheck = 1
end if

if time = 134500 and (Q_time > 134400 or Q_time = 000000) and dayEndCheck = 1 then
buy this bar at market
end if


大概會類似這樣…不過還沒實測過這樣的結果到底是會正常還是不正常。

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
2009年11月3日星期二

程式交易 - HTS 多週期指標寫法(以基本KD為例)

6 回應

在 HTS 上如果需要完成多週期的策略,例如 30 分鐘抓 60 分鐘的資料等…通常會遇到不少問題…今天動手寫了個 KD 的指標出來…是在 30 分鐘內去把 60 分鐘的 KD 指標畫出來的程式…過程中遇到許多的困難…所以真的有興趣寫多週期的可能需要好好研究一下這個程式了。

首先是指標的程式碼,先把基本的 KD 指標給大家看一下…也就是原本的程式:

Parameters : HighLowTerm(9), OverSold(20), OverBought(80)
Variable : Factor(1/3)

Value1 = VALUE1[1] + (Factor * (FastK(High, Low, Close, HighLowTerm) - VALUE1[1]))
Value2 = 2/3*Value2[1]+Value1*1/3

DrawBase1( OverBought, "Over Bought", DarkGray )
DrawBase2( OverSold, "Over Sold", DarkGray )
Draw2( Round( Value2,2), "Slow %D", Blue)
Draw1( Round( Value1,2), "Slow %K", Red)


接下來…就是利用上面的 KD 指標來完成 30 分線內抓 60 分資料並畫出的程式碼:


Parameters : HighLowTerm(9), OverSold(20), OverBought(80)
Variable : Factor(1/3)

vars:high1(0), high2(0), high3(0), high4(0), high5(0), high6(0), high7(0), high8(0), high9(0)
vars:low1(0), low2(0), low3(0), low4(0), low5(0), low6(0), low7(0), low8(0), low9(0)

Condition1 = time = 94500 or time = 104500 or time = 114500 or time = 124500 or time = 134500

if Condition1 then
high9 = maxlist(high[16], high[17])
high8 = maxlist(high[14], high[15])
high7 = maxlist(high[12], high[13])
high6 = maxlist(high[10], high[11])
high5 = maxlist(high[8], high[9])
high4 = maxlist(high[6], high[7])
high3 = maxlist(high[4], high[5])
high2 = maxlist(high[2], high[3])
high1 = maxlist(high, high[1])

low9 = minlist(low[16], low[17])
low8 = minlist(low[14], low[15])
low7 = minlist(low[12], low[13])
low6 = minlist(low[10], low[11])
low5 = minlist(low[8], low[9])
low4 = minlist(low[6], low[7])
low3 = minlist(low[4], low[5])
low2 = minlist(low[2], low[3])
low1 = minlist(low, low[1])

Value1 = minlist(low9, low8, low7, low6, low5, low4, low3, low2, low1)
Value2 = maxlist(high9, high8, high7, high6, high5, high4, high3, high2, high1) - Value1
Value3 = Close

Value4 = Value4[2] + (Factor * (((Value3 - Value1) / Value2 * 100) - Value4[2]))
Value5 = 2/3 * Value5[2] + Value4 * 1/3
end if

DrawBase2( OverBought, "Over Bought", DarkGray )
DrawBase1( OverSold, "Over Sold", DarkGray )
Draw2( Round( Value5,2), "Slow %D-60", Blue)
Draw1( Round( Value4,2), "Slow %K-60", Red)



完成後的圖會長這樣:



我想整個轉換過程並算不上容易…首先必需去研究指標用到的函式有哪些…再去看每個函式的運算過程…接下來再依照運算過程會使用到的資料去想辦法存到一個正確的值。

HTS 的 highest, lowest 的問題非常嚴重…能不用就不要用…所以我都改用 maxlist 和 minlist…再來就是依照時間的週期去定下 condition。

還好 KD 還算簡單…如果是 MACD 的話,還是轉用 TradeStation 會簡單一點。

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
2009年10月31日星期六

程式交易全攻略 - 講座資訊

0 回應

題目: 善用TS策略報表,精進程式交易功力,與虧損共舞!

主講人: PARKSON DOW

本講座適合已經有在作程式交易的人參加

時間:11月19日 下午6:30 進場~21:00結束

地點:台中市五權西路一段257號 9樓~3 (大華期貨 台中分公司)

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
2009年10月26日星期一

程式交易 - 200910 績效

0 回應

經朋友提醒才發現十月績效忘了 PO …也許是最近實在太悲慘了。所以整個沒心情去看績效了吧…十月合約依舊難作…愈來愈多在九點前的急殺急拉…也愈來愈多在程式進場後行情就結束的情況出現了。我想這也是需要思考的地方…畢竟盤勢還是會變動的。


當沖程式:
F4 當沖組合:-153 點

Y拍程式:
10K當沖:-24 點
10K波段: 66 點
30K波段:-675 點

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
2009年10月22日星期四

程式交易全攻略 - P.152 移動停損程式修正

2 回應

之前已經有提到過移動停損點的作法了…請參考這兩篇文章:程式交易 - 移動停損點作法程式交易 - 移動停損點、進場方法,這邊就再另外把書裡的程式錯誤地方修正一下。

這邊的例子是進場後設 20 點為停損點…當獲利大於 50 點時…將停損移動到買進價上 20 點。


vars:exitCount(0), mc(0);

if date <> date[1] then
exitCount = 0;

mc = marketposition * currentcontracts;

if marketposition > 0 then
exitlong next bar at entryprice(0) - 20 stop;

if marketposition < 0 then
exitshort next bar at entryprice(0) + 20 stop;

if marketposition > 0 and high > entryprice(0) + 50 then
exitCount = 1;
if marketposition < 0 and low < entryprice(0) - 50 then
exitCount = 1;

if marketposition > 0 and exitCount = 1 then
exitlong next bar at entryprice(0) + 20 stop;

if marketposition < 0 and exitCount = 1 then
exitshort next bar at entryprice(0) - 20 stop;

if mc <> mc[1] then
exitCount = 0;



這個程式裡面用到了兩個變數…一個是 exitCount 另一個是 mc,exitCount 的作用是拿來記錄目前是否有獲利大於 50 點…當有獲利大於 50 點的時候就把這個變數更改為 1,另一個 mc 變數則是拿來記錄目前的倉位。

基本上我自己在寫程式的時候有很多變數是很常會運用到的…首先就是 mc ,這個變數可以記錄倉位的變化,直接使用 marketposition 只可以知道目前的倉位…但是沒辦法知道上一根的倉位是怎麼樣。所以就利用一個變數來記錄。

接下來就是很簡單的出場語法了…有單的時候就是在進場價虧損 20 點的時候觸價出場。如果有單的時候而且 exitCount = 1 就在進場價獲利 20 點的時候出場。

提供給大家作參考…也很抱歉在校稿的時候乎略了這一部份。

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
2009年10月16日星期五

奇狐 Forcast 線性回歸預測值 轉 HTS

5 回應

一個有趣的指標 這篇文章內提到了還有一個線性回歸預測值的東西還沒有解決…一直到最近有機會再接觸到這個函式…這邊就把這個線性回歸轉 HTS 的程式碼給大家玩玩看囉。

首先新增一個函式取名為 LinearRegValueFC:

Parameter: Price(Numeric), Len(Numeric), TargetB(Numeric)
Variables: X(0), Num1(0), Num2(0), SumBars(0), SumSqrBars(0), SumY(0), Sum1(0), Sum2(0), Slope(0), Intercept(0)

If Len = 0 Then
LinearRegValueFC = 0
End If

Sum1 = 0;

If CurrentBar = 1 Then
SumBars = SumBars[1]
SumBars = Len * (Len - 1) * 0.5
SumSqrBars = (Len - 1) * Len * (2 * Len - 1) / 6
End If

For X = 0 To Len - 1
Sum1 = Sum1 + X * Price[X]
End For

SumY = Sum(Price, Len)
Sum2 = SumBars * SumY
Num1 = Len * Sum1 - Sum2
Num2 = SumBars * SumBars - Len * SumSqrBars

If Num2 <> 0 Then
Slope = Num1 / Num2
Else
Slope = 0
End If

Intercept = (SumY - Slope * SumBars) / Len

LinearRegValueFC = Intercept + Slope * (Len - 1 + CurrentBar - CurrentBar - TargetB)



再新增以上程式內容即可。
使用的方式就跟奇狐 Forcast 一樣。這樣就解決掉了線性回歸的問題囉。

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
2009年10月13日星期二

程式交易 - 限制一日虧損

0 回應

在這一篇文章裡面提到:程式交易 - 達一日最大虧損後不再進場的語法 利用 netprofit 的方式來限制一天的最大虧損。這邊提出另一個寫法…回到利用進出場點的計算來限制一日的最大虧損。

程式碼如下:

vars: dayLoss(50);
vars: mc(0), entryCount(1);

if date <> date[1] then begin
dayLoss = 50;
entryCount = 1;
end if

mc = marketposition * currentcontracts;

if mc[1] = 1 and mc = 0 then
dayLoss = dayLoss + exitprice(0) - entryprice(0)
if mc[1] = -1 and mc = 0 then
dayLoss = dayLoss + entryprice(0) - exitprice(0)
if mc[1] = -1 and mc = 1 then
dayLoss = dayLoss + entryprice(1) - entryprice(0)
if mc[1] = 1 and mc = -1 then
dayLoss = dayLoss + entryprice(0) - entryprice(1)

if dayLoss <= 0 then
entryCount = 0;

if marketposition > 0 then
exitlong next bar at entryprice(0) - dayLoss stop;
if marketposition < 0 then
exitshort next bar at entryprice(0) + dayLoss stop;



大概如上…利用進場的價位和出場的價位把目前可以損失的點數 (dayLoss) 計算出來。也就是說如果第一筆單是獲利 20 點的話…那 dayLoss 就會變成 70 點。也就是接下來的單子可以虧損 70 點。

可以看到我在 dayLoss <= 0 的時候把一個變數 entryFlag 設定為 0,這個變數是需要加在進場的時候順便檢查是否為 1 的,才可以達到 dayLoss <= 0 的時候不再進場。

這樣的寫法大概比較容易了解一點。

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo
2009年10月7日星期三

高低點出現在五分K結束時的次數

8 回應

因為最近常常有被害妄想症…一直認為最近的主力在大玩程式單(所謂玩並不是他們也在用程式交易…而是玩我們這些程式交易者)…雖然最近三四個月的觀察似乎真的有這種感覺。強拉或強殺一波之後…等著五分 K 收線前停止…然後全部倒給程式單。

也因為有這樣的感覺…我寫了個程式統計了一下 95 年到目前為止…當天的高低點出現在 5 分 K 的次數。


以下是程式碼:

vars:Times105(0), Times106(0), Times107(0), Times108(0), Times109(0);
vars:highTimeTemp(0), lowTimeTemp(0);

if date >= 1090101 and date < 1100101 then begin
if high = highd(0) then
highTimeTemp = time;
if low = lowd(0) then
lowTimeTemp = time;
if date <> date[1] then begin
if mod(highTimeTemp[1], 5) = 0 then begin
if year(date) = 105 then
Times105 = Times105 + 1;
if year(date) = 106 then
Times106 = Times106 + 1;
if year(date) = 107 then
Times107 = Times107 + 1;
if year(date) = 108 then
Times108 = Times108 + 1;
if year(date) = 109 then
Times109 = Times109 + 1;
end;
if mod(lowTimeTemp[1], 5) = 0 then begin
if year(date) = 105 then
Times105 = Times105 + 1;
if year(date) = 106 then
Times106 = Times106 + 1;
if year(date) = 107 then
Times107 = Times107 + 1;
if year(date) = 108 then
Times108 = Times108 + 1;
if year(date) = 109 then
Times109 = Times109 + 1;
end;
end;
end;


if lastBarOnChart then
print(Times105, Times106, Times107, Times108, Times109);



因為是用 1 分鐘下去跑…所以一次開五年太多了…所以就分開一年一年統計一下…得到的結果:

05 年: 114 次
06 年: 110 次
07 年: 95 次
08 年: 98 次
09 年: 53 次

比較起來今年出現的次數還比較少…所以說不定還真的是被害妄想症。不過盤中觀察到的重點應該也是事實才對。

HEMiDEMi Technorati Del.icio.us MyShare個人書籤 Yahoo