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

2009年7月28日 星期二

程式交易 - 達一日最大虧損後不再進場的語法

以往在限制進場次數時…通常都會用到 exitprice(0) - entryprice(0) 這類的方式…去計算最近的出場和進場間是否是虧損或獲利。不過後來寫到了翻單程式後…就發現這類的寫法實在不適合用…或是程式用直接始用 setstoploss 的話…也沒辦法正確的限制到進場次數。

一開始的程式如下:

vars: count(0);

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

if count = 0 and time > 900.00 and time < 1300.00 then begin
if (marketposition = 0 or close < entryprice(0)) and average(close, 10) cross over average(close, 20) then begin
buy ("b1") next bar at market;
end;
if (marketposition = 0 or close > entryprice(0)) and average(close, 10) cross under average(close, 20) then begin
sell ("s1") next bar at market;
end;
end;

if marketposition < 0 and average(close, 10) cross over average(close, 20) then begin
exitshort ("exs1") next bar at market;
count = 1;
end;
if marketposition > 0 and average(close, 10) cross under average(close, 20) then begin
exitlong ("exb1") next bar at market;
count = 1;
end;

if time = 1330.00 and marketposition <> 0 then begin
exitlong next bar at market;
exitshort next bar at market;
end;

setstoploss(8000);

簡單的運用了一個 count 來作為進出場的限制條件…當停損條件達到…就把 count 設為 1,所以停損條件成立後就不會再進場了…直到次日才會再進場。

程式的執行狀況如下:



如果看到這天很正常的在停損條件成立後沒有在進場了。

不過接下來就有問題了:



這是在 setstoploss(8000) 成立的出場,所以就沒辦法利用 count 來作限制了。

另外也為了解決直接反手的狀況…直接反手的情況要算出上一筆的賺賠得用 entryprice(0) - entryprice(1) 這又造成了不少的問題…得把程式寫的很複雜…所以這邊就提出一個比較簡單且能適用各種狀況的方式。


vars: count(0);
vars: mc(0), gp(0);

mc = marketposition * currentcontracts;
gp = netprofit;

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

if count = 0 and time > 900.00 and time < 1300.00 then begin
if (marketposition = 0 or close < entryprice(0)) and average(close, 10) cross over average(close, 20) then begin
buy ("b1") next bar at market;
end;
if (marketposition = 0 or close > entryprice(0)) and average(close, 10) cross under average(close, 20) then begin
sell ("s1") next bar at market;
end;
end;

if marketposition < 0 and average(close, 10) cross over average(close, 20) then begin
exitshort ("exs1") next bar at market;
count = 1;
end;
if marketposition > 0 and average(close, 10) cross under average(close, 20) then begin
exitlong ("exb1") next bar at market;
count = 1;
end;

if time = 1330.00 and marketposition <> 0 then begin
exitlong next bar at market;
exitshort next bar at market;
end;

if mc <> mc[1] and gp < gp[1] then
count = 1;

setstoploss(8000);


基本上程式碼沒多大的變動…可以看到我新增了二個變數…一個為 mc 一個為 gp

這兩個變數分別儲存了倉位的改變和 netprofit 的改變…透過這樣的方式來檢查上一次的進出場是否為獲利…如果為虧損的話…就直接把進場的 count 限制掉…就可以達到限制進場次數了。

14 則留言:

  1. 感謝阿
    逆向程式最需要的限制虧損次數拉
    因為順項程式如果順利可能就不再進場
    逆向程式因為賺少些所以進出次數就會多
    另外ˇ
    CDP 如何把AH,AL 標示在K線圖上? paint BAR 如何弄? 謝謝

    回覆刪除
  2. 我在HTS也是這樣寫
    if time = 85000 then
    no_order = 1
    end if
    if no_order = 1 then
    if XXXXX......
    ..............
    buy
    ..............
    sell
    ..............
    end if
    if ........
    exitlong .......
    exitshort ......
    no_order = 0
    end if
    endif

    出場後就不在進場,一天只做一趟,結果盤中會再進場,但是盤中回補K棒資料之後,第二次進場的訊號就消失了,只有剩下第一次進出場的資料,一直查不到問題出在哪?

    回覆刪除
  3. 請教DK大
    在HTS的 entryname和exitname在TS要改成什麼?

    回覆刪除
  4. dylon: 不建議在最外面把一個 if 包起來...所以試試把最外層的 if no_order = 1 拿掉..
    並在每個 if XXXX 加上 and no_order = 1
    試試

    另外就是 entryname 和 exitname ..TS 沒有..所以就如上一個回應一樣..用一個變數存了..

    回覆刪除
  5. danelongg: 利用劃均線的方式就行了..應該不需要用到 paint bar 耶

    回覆刪除
  6. 謝謝DK大的建議,我在試試看...

    回覆刪除
  7. 請問大大
    如果要想進場之後程式賺了100點
    若如果回吐到只剩賺50點就立即出場
    是這樣寫嗎
    if marketposition = 1 and h > (entryprice(0) +100) then begin
    buygo = entryprice(0) + 50 ;
    end;

    if marketposition = 1 then exitlong ("buygo") at buygo stop;

    謝謝大大

    回覆刪除
  8. 皮皮小金剛:這樣可以..

    回覆刪除
  9. 作者已經移除這則留言。

    回覆刪除
  10. DK大您好:
    想請教一下如果我的策略是有反手的話,那要怎麼讓程式在損失達到一定金額後反手條件不進場呢?
    反手程式碼如下
    If marketposition = -1 and NetProfit >= netp - Netloss then begin
    If Close>Average(close,20) then begin
    exitshort("Short-Stop") next bar at market;
    Buy("S-to-B") next bar at market;
    end;
    End;

    回覆刪除
  11. DK大:
    你好!想請問你一下!若我想要比較昨天的漲(跌)幅跟今天一開盤的點數作比較然後作出買(賣)動作,以下程式碼是否正確呢
    假設昨天開盤到收盤為跌一百點,但今天一開盤就漲150點,則於一開盤就作買進動作!

    value1=closed(1)-closed(60);
    value2=closed(0)-closed(1);
    absvalue3=value(value1)
    absvalue4=value(value2)
    if value4 > value2 then
    buy next bar at market;

    回覆刪除
  12. Alvin: 光看這樣看不太懂,你可以試著把出場和反手的條件分開寫。

    回覆刪除
  13. 咖啡:你試著按一下檢查程式碼應該就知道錯很多了。

    回覆刪除
  14. DK大提到
    另外就是 entryname 和 exitname ..TS 沒有..所以就如上一個回應一樣..用一個變數存了

    請問那在TS上能不能給個範例
    用變數把入場的名稱存下來
    謝謝

    回覆刪除

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

Related Posts Plugin for WordPress, Blogger...