先看下圖…這是原本的情況,一口單不加碼…
也許有人會想說…何必這麼麻煩呢…我直接每次都下二口單不就好了…當然,這樣獲利會變二倍,不過相對的…最大連續虧損也會變二倍…請看下圖,這是直接下二口單的情況…
接下來,就是本篇的重點了…由於我的程式最多連續虧損是 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
D.K.大大
回覆刪除晚安!
請問您是否有Hts的版本?
我很需因為我主要交易平台目前還在hts
還在轉ts的過度期
是否能有一個HTS版本造福廣大的HTS使用者?
已補上 hts 程式碼..
回覆刪除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
//停損加碼start//////////////////////////////
回覆刪除這個前面少了點東西喔..你沒給 wintrade 和 lostrade 值呢…
這個
wintrade = numwintrades
lostrade = numlostrades
再試試看囉..:p
可以了歐
回覆刪除謝d.k.大
D.K.大大
回覆刪除你真的是佛心來也!!
希望大大能持續提供ts這方面的教學!!
感謝感謝
你好
回覆刪除這個月剛學到這樣的觀念
虧損後加碼.確實好用 .不過新中恐懼實在是不言可喻.好似站在10公尺高的跳水台上要跳下去....
不過,真的爽.看到獲利倍增.爽 謝謝分享(程式還看不懂,也不會用;希望有一天會用的上.好好用它來造福)
台中---運隆
謝謝你的支持啊..
回覆刪除請問這個程式碼 是不是在 連輸二次後下了二口
回覆刪除那麼不管下二口這次是輸還是勝 下次還是下二口 直到再輸了才會改為一口
呵呵我知道我的問題所在了
回覆刪除如果你是下stop單 而且一直有部位在市場
那麼這個寫法會讓你其實是跳過一次才會下二口
不知大大有沒有好的方法解決
甘恩
這個大概沒辦法..因為你要出場後才知道前一筆的損益是多少...所以只能等下一筆單啦..:p
回覆刪除這樣似乎有事後諸葛的疑慮? 因為您已經先知道回測過程會遇到幾次連續虧損, 再把這個資訊寫回程式執行, 似乎不大妥當.
回覆刪除是這樣沒錯..這只是比較不一樣的加碼方式而已…而這種方式是好是壞?就看個人了…
回覆刪除你好!我想請問您~~如果我想要測試資本膨脹後;譬如原來資本50萬元作一口,後來資本變為100萬時,會變成作兩口,這樣該怎麼設計?
回覆刪除casey: 這個在下單時把倍數乘二就行了…還是你連資金控管的部份也想寫進程式呢?
回覆刪除我是想連資金控管的部份都寫進去,因為這樣比較合理,資本膨脹後,自然交易口數會增加,如果能夠的話,還望請解惑,感恩~~~
回覆刪除casey: 您好...這個部份我還沒有實作過呢..目前還是以手動調整下單倍數來做..
回覆刪除請問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
我的會變成連輸二次後下了二口
那麼不管下二口這次是輸還是勝 下次還是下二口
請問我的程式碼 哪裡出了問題了呢 謝謝!!!
love760723: 是這樣沒錯啊…因為我原來的想法就是連輸後加碼,在加碼後如果還是輸,那就還是維持加碼的情況,如果是贏,那當然就要繼續維持加碼的情況啦。
回覆刪除加碼後的贏,接下來接一次輸才會回到原來的口數。