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

2009年11月10日 星期二

程式交易 - Q_Time 用法

首先要說明的是 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


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

17 則留言:

  1. 請教DK,奇狐的barslast函數在TS上如何呈現? 感謝幫忙!

    回覆刪除
  2. J.I. 這個必需要自行去計算了...我有利用 barnumber 去算過..在條件成立時計下當時的 barnumber..接著再去用目前的 barnumber 減掉就知道過了多少根 k 線了

    回覆刪除
  3. 試作一下,看起來可以用,一開始想太多,加了許多不曾用過的函數,又沒手冊,結果搞得頭昏腦脹.去蕪存菁得到以下程式碼.

    //X上次條件成立到當前的週期
    //注意這是數值型函數不是指標喔,命名是BarsLast
    //在指標中引用應有Variables:ABC(false),其中ABC是任意給的
    //引用BarsLast(ABC)函數時ABC為boolean
    Parameter: X(bool)
    Variables:Counter(0)

    If X = True Then
    Counter = 0
    Else
    Counter = Counter + 1
    End If

    BarsLast = Counter

    回覆刪除
  4. 試作奇狐中的Filter,請參考邏輯測試看看
    初步看起來可以用,如有更正確寫法,請能指正.

    //X條件成立後,將其後N週期內的數據設為0,不被採用.這裡是傳回偽false
    //注意這是倫理型函數不是指標喔,命名是Filter
    //在指標中引用應有Variables:ABC(false),其中ABC是任意給的
    //引用Filter(ABC,N)函數時ABC為boolean


    Parameter: X(bool), Length(Numeric)
    Variables: Counter(0)

    If X = True Then
    If Counter <= Length Then
    Filter = False
    Counter = Counter + 1
    Else
    Filter = True
    Counter = 0
    End If
    Else
    Filter = False
    Counter = Counter + 1
    End If

    print(b2,b3)測試部分結果
    b1 = Value70 cross over Value8
    b2 = Filter(b1,5)
    b3 = BarsLast(b2)

    TRUE 0.00
    FALSE 1.00
    FALSE 2.00
    FALSE 3.00
    FALSE 4.00
    FALSE 5.00
    FALSE 6.00
    FALSE 7.00
    FALSE 8.00
    FALSE 9.00
    TRUE 0.00
    FALSE 1.00
    FALSE 2.00
    FALSE 3.00

    回覆刪除
  5. //BarsLast修正如下:
    //由於輸入有可能是連續True,False

    Parameter: X(bool)
    Variables:Counter(0),Counter1(0)


    If X = True Then
    Counter = 0
    Counter1 = Counter1 + 1
    Else
    Counter1 = 0
    Counter = Counter + 1
    End If

    If Counter>Counter1 Then
    BarsLast = Counter
    Else
    BarsLast = Counter1
    End If

    回覆刪除
  6. 謝謝peter的分享!真的是厲害~這個對於奇狐語法轉TS有很大的幫助

    回覆刪除
  7. peter: 感謝您的用心…如果方便的話我會弄成一篇文章喔。

    回覆刪除
  8. 會公佈也是想大家研究看看,有沒有更好的邏輯去完成更好的勝率,其實目前的寫法還不夠完美,如果像奇狐那樣有三個狀態,1,-1,0
    時,又當如何?

    DK:能整理成一篇文章定能造福更多人,網路上那麼多人在問這個問題.
    只是幫助有多大實在不知道,只要告訴大家那是一個五十多歲的阿伯peter 寫的就好了.

    回到正題像奇狐那樣有三個狀態,X也可以這樣用
    Parameter: X(Numeric)
    Variables:Counter(0)


    If X <> X[1] Then
    Counter = 0
    Else
    Counter = Counter + 1
    End If

    //BarsLast = Counter + 1

    If Counter = 0 And X[1] <> X[2] Then
    BarsLast = 1
    Else
    //排除第一次轉換時誤植為1

    以上寫法未完成,大家研究看看.

    回覆刪除
  9. peter: 謝謝你的熱心…不過提出一個之前遇到的問題...利用 counter 去累加是一個辦法..可是當該條件很久才出現一次的時候...問題就會滿大的...因為會導至 TS 運算量過大...而無法正常運作。

    之前寫到二個 barlast 條件..一直都累加到數百根 k 線過後還沒有出現的時候… K 線數開到 500 就會讓我的 TS 整個停住了。

    所以到後來我的寫法比較偏向記錄的方式。

    在條件成立時候去記錄下來目前的 barnumber,等到下次成立的時候再用當時的 barnumber 去減到上一次成立的 barnumber得到結果。

    這樣的方式可以只有一個 barnumber 在作累加的動作…其它的部份都只是一個變數去存一個數值下來。

    回覆刪除
  10. D.K.您好
    雖然有買TS的書來參考,但目前並沒有安裝或使用,無法了解上述問題,不過您的做法應是正確的.
    現在是用HTS,如果是看三十分鐘,一星期大慨有十個信號,不會有TS的那種情形.
    順便一提,那天喝得如何?最近也都在作空,不過都閃得很快,並沒受傷.這兩個月盤勢刁鑽的很,好像有一群人價差5~10點就跑,苦了一般大眾.
    寫那兩個函數,並沒在用.現在是用自己寫的均線和三才線看盤.

    回覆刪除
  11. peter: 如果訊號多的話就比較沒問題..相同的問題在 hts 應該也是會發生才對。

    回覆刪除
  12. 請問peter大大可以把filter函數改成HTS版嗎?謝謝

    回覆刪除
  13. backset..函數....求救...請幫我改成 ts..版..

    回覆刪除
    回覆
    1. 我看不太懂 backset 在作什麼…不如你直接把想要的功能說出來我會比較明白一點…

      刪除
    2. backset(x,n) -->若x<>0 則把當日及前n-1日的數值設為1;

      刪除
  14. 大神您好,請問可以作一個HTS的SUMBARS函數嗎?謝謝大神

    回覆刪除

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

Related Posts Plugin for WordPress, Blogger...