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

2008年8月15日 星期五

程式交易 - 運用連續虧損次數執行動態加減碼

會有這個想法呢…是從連續虧損後勝率會變高的情況…也就是說,如果一個系統回測後最多的連續虧損次數是 4 次,那在連續虧損已經 2 次的情況下,下一次進場的勝率會增加不少;如果已經連續虧損 3 次,那下一次進場的勝率更是會提升…所以在這種情況,如果能在已經出現連續虧損的情況下,讓程式自行加碼,那應該會不錯吧…所以就完成了這個程式…

先看下圖…這是原本的情況,一口單不加碼…


也許有人會想說…何必這麼麻煩呢…我直接每次都下二口單不就好了…當然,這樣獲利會變二倍,不過相對的…最大連續虧損也會變二倍…請看下圖,這是直接下二口單的情況…


接下來,就是本篇的重點了…由於我的程式最多連續虧損是 4 次…所以我設的設定為出現連續虧損 2 次後,就轉為每次下二口單…一直到賺錢單出現再出現虧損單後,就再轉回一口…也就是說下單的情況是這樣:賺(1)賺(1)賠(1)賠(1)賠(2)賺(2)賺(2)賺(2)賺(2)賠(2)賺(1)
在這樣的下單模式會有如下的績效…


當然…沒有一次直接下二口單來的好…不過最大連續虧損並沒有增加太多呢…下面這張圖是下單的狀況…可以比較清楚看到什麼時候變為二口單…又什麼時候轉回一口單…


這種利用連續虧損的次數來動態加減碼…必需自行對程式做調整,也許你的程式最大連續虧損次數是六次…那也許出現連續虧損三次後再加碼會比較好…當然…這就自己研究吧…

下面就來說說這要怎麼寫到程式裡…因為 TS 並沒有函數可以回傳目前已經連續虧損幾次了…所以…全部的東西就自己來做吧…

首先…準備幾個變數

vars:con(1), wintrade(0), lostrade(0);
vars:testcon(0);
wintrade = numwintrades;
lostrade = numlostrades;

這邊是利用到目前賺的次數和賠的次數來計算…所以先準備好上面的東西吧…接著重點來囉…

if wintrade > wintrade[1] then begin
testcon = 0;
end;
if lostrade > lostrade[1] then begin
testcon = testcon + 1;
end;
if testcon = 2 then begin
con = 2;
end;
if testcon = 1 and testcon[1] = 0 then begin
con = 1;
end;

我運用了如果賺錢的次數是增加,那 testcon 為 0,另外如果賠錢的次數增加,那 testcon 就加一,再由 testcon 去判斷目前下單的口數是多少, con 這個變數就是下單的口數…
大概就這樣囉,最後只要再進場時加上 con 這個變數就行了…如下:

buy ("B1") con contract next bar at market;

也許這樣的寫法不是很好…不過目前就只有想到這樣寫啦…想要更好更簡單的寫法…那就只好等待有緣人啦…

補上 HTS 版本…

vars:con(1), wintrade(0), lostrade(0)
vars:testcon(0)
wintrade = numwintrades
lostrade = numlostrades

if wintrade > wintrade[1] then
testcon = 0
end if
if lostrade > lostrade[1] then
testcon = testcon + 1
end if
if testcon = 2 then
con = 2
end if
if testcon = 1 and testcon[1] = 0 then
con = 1
end if

buy ("B1") con contract next bar at market

19 則留言:

  1. D.K.大大

    晚安!
    請問您是否有Hts的版本?
    我很需因為我主要交易平台目前還在hts
    還在轉ts的過度期
    是否能有一個HTS版本造福廣大的HTS使用者?

    回覆刪除
  2. d.k.大
    後輩適合進HTS跑,結果跑不出2口單...
    請前輩指點迷津...

    屬性設定上:
    最多庫存設 = 2
    點選啟 用同一Singal名...

    然後程式碼如下:
    Parameters :len(6),overbought(68),oversought(33),停金額(1900)
    Variables: StopLossAmount(0), OrderPrice(0)
    vars:con(1), wintrade(0), lostrade(0)
    vars:testcon(0)

    //停損加碼start//////////////////////////////
    if wintrade > wintrade[1] then
    testcon = 0
    end if
    if lostrade > lostrade[1] then
    testcon = testcon + 1
    end if
    if testcon = 2 then
    con = 2
    end if
    if testcon = 1 and testcon[1] = 0 then
    con = 1
    end if
    //停損加碼end//////////////////////////////


    ///新昌買空//////////////////////////////////////////////////////////
    if Marketposition =1 and rsi(close,len) > overbought then
    sell("S") con contract this bar on close
    end if


    ///新昌買多//////////////////////////////////////////////////////////

    if Marketposition =0 and rsi(close,len) < oversought then
    buy("B") con contract Next Bar At Market
    end if

    if Marketposition =-1 and rsi(close,len) < oversought then
    buy("Ba") con contract Next Bar At Market
    end if

    //===停損==========================================
    //多,空單停損。價格觸價停損出場
    If MarketPosition <> 0 Then
    StopLossAmount = 停金額
    OrderPrice = Entryprice(0) - (StopLossAmount / PointValue)
    ExitLong ("Stop") Next Bar At Orderprice stop
    End if

    回覆刪除
  3. //停損加碼start//////////////////////////////
    這個前面少了點東西喔..你沒給 wintrade 和 lostrade 值呢…
    這個
    wintrade = numwintrades
    lostrade = numlostrades
    再試試看囉..:p

    回覆刪除
  4. 可以了歐
    謝d.k.大

    回覆刪除
  5. D.K.大大

    你真的是佛心來也!!

    希望大大能持續提供ts這方面的教學!!

    感謝感謝

    回覆刪除
  6. 你好
    這個月剛學到這樣的觀念
    虧損後加碼.確實好用 .不過新中恐懼實在是不言可喻.好似站在10公尺高的跳水台上要跳下去....
    不過,真的爽.看到獲利倍增.爽 謝謝分享(程式還看不懂,也不會用;希望有一天會用的上.好好用它來造福)
    台中---運隆

    回覆刪除
  7. 請問這個程式碼 是不是在 連輸二次後下了二口
    那麼不管下二口這次是輸還是勝 下次還是下二口 直到再輸了才會改為一口

    回覆刪除
  8. 呵呵我知道我的問題所在了
    如果你是下stop單 而且一直有部位在市場
    那麼這個寫法會讓你其實是跳過一次才會下二口

    不知大大有沒有好的方法解決
    甘恩

    回覆刪除
  9. 這個大概沒辦法..因為你要出場後才知道前一筆的損益是多少...所以只能等下一筆單啦..:p

    回覆刪除
  10. 這樣似乎有事後諸葛的疑慮? 因為您已經先知道回測過程會遇到幾次連續虧損, 再把這個資訊寫回程式執行, 似乎不大妥當.

    回覆刪除
  11. 是這樣沒錯..這只是比較不一樣的加碼方式而已…而這種方式是好是壞?就看個人了…

    回覆刪除
  12. 你好!我想請問您~~如果我想要測試資本膨脹後;譬如原來資本50萬元作一口,後來資本變為100萬時,會變成作兩口,這樣該怎麼設計?

    回覆刪除
  13. casey: 這個在下單時把倍數乘二就行了…還是你連資金控管的部份也想寫進程式呢?

    回覆刪除
  14. 我是想連資金控管的部份都寫進去,因為這樣比較合理,資本膨脹後,自然交易口數會增加,如果能夠的話,還望請解惑,感恩~~~

    回覆刪除
  15. casey: 您好...這個部份我還沒有實作過呢..目前還是以手動調整下單倍數來做..

    回覆刪除
  16. 請問dk大大 我去你的部落格看有一篇文章是 "程式交易-連續虧損次數執行動態日減碼" 而我就去修改我的程式了 我的程式碼是這樣寫的 麻煩你幫我看看對不對

    param:DOLLARRISK(17200)
    vars:con(1), wintrade(0), lostrade(0)
    vars:testcon(0)
    wintrade = numwintrades
    lostrade = numlostrades
    if wintrade > wintrade[1] then
    testcon = 0
    end if
    if lostrade > lostrade[1] then
    testcon = testcon + 1
    end if
    if testcon = 2 then
    con = 2
    end if
    if testcon = 1 and testcon[1] = 0 then
    con = 1
    end if
    //進場條件//
    If time >= 094500 and time < 133000 and close < HL then
    buy("B") con contract next bar HL stop;
    end if
    If time >= 094500 and time < 133000 and close >LL then
    sell("S") con contract next bar LL stop;
    end if
    if marketposition<>0 and time>=133500 then
    exitlong("FS") next bar at market;
    exitshort("FB") next bar at market;
    end if


    請問這樣對嗎?
    可是我跑出來的 不對a
    我的會變成連輸二次後下了二口
    那麼不管下二口這次是輸還是勝 下次還是下二口

    請問我的程式碼 哪裡出了問題了呢 謝謝!!!

    回覆刪除
  17. love760723: 是這樣沒錯啊…因為我原來的想法就是連輸後加碼,在加碼後如果還是輸,那就還是維持加碼的情況,如果是贏,那當然就要繼續維持加碼的情況啦。

    加碼後的贏,接下來接一次輸才會回到原來的口數。

    回覆刪除

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

Related Posts Plugin for WordPress, Blogger...