2020年6月26日 星期五

停損停利語法 --- 應避免使用固定點數停損停利


之前提到固定點數停損和停利是新手必學的,但現在為甚麼要說不用固定點數停損停利? 原因有幾個:

1. 單純個的風度沒有代表性。如果200點是你可承受的損失,進場後設200點停損。同一個進場點,別人A可承受的損失是400 點,他設400點停損; 別人B  可承受的損失是100 點,他設100點停損。如果你認為賺500點可停利,別人A可能認為賺 1000點才夠,他設1000點停利; 別人B可能賺 400點就跑。你不能代表別人對風險和回報的理解與承度,但市場會因應大眾對風險和回報的理解與承度而發展。

2. 回測出來的停損停利點未必適合將來。假設行情是9000~11000 點時,設停損300 點適,當行情來到20000 點時,設停損300 點還適? 假若回測時期長的話,固定點數停損停利可能出現以下情況:你所設的停損停利點較適合回測時期早期的行情,較後期的行情則不適合或相反情況。

3. 行情的發展並不會因為你的停損停利點是甚麼而改變。行會因為你的多單出了而向下嗎? 或因為你的空單出了而向上嗎?  應根據你對市場的認識寫出市況判的訊號,依訊號進出為主要依據,停損是最後的保險手段,避免訊號未觸發前有突發情況出現。至於停利,待價格回了才跑吧。

 

如果不用固定點數停損和停利,還有很多方式停損停利的,有非固定的和動態的。例如 entryprice 的某個百分比,ATR 損停利法,NK棒的突破等等。


2020年6月24日 星期三

停損停利語法 --- 最基礎的固定點數停損和停利

固定點數停損和停利是新手必學的,因語法最簡單,一行寫停損,一行寫停利就行了。如果程式是會做多和做空的,那就一行多單停損,一行多單停利,一行空單停損,一行空單停利。以下有一個固定點數停利的例子:

Vars: MP(0);

MP = marketposition;

 

Inputs: profit(100);

 

If MP = 1 then sell next bar entryprice + profit limit;

If MP = -1 then buytocover next bar entryprice - profit limit;

 

以上例子中有多單和空單,設停利100 點。用entryprice這個關鍵字便可得出進場價格。MP = 1為持有多單,MP = -1為持有空單。持有多單時價格上了100 limit 單停利,持有空單時價格跌了100 limit 單停利。以有一個固定點數停損的例子:

Inputs: STP(30);

 

If MP = 1 then sell next bar entryprice - STP stop;

If MP = -1 then buytocover next bar entryprice + STP stop;

 

持有多單時價格跌了30 stop 單停損,持有空單時價格上了30 stop 單停損。停損要用stop 單,停利用limit 單。limit 單即限價單,欲掛出的價格比現價好時用限價單,停利就是當行情發展向好的方向時出場。stop 單即是追價單,欲掛出的價格比現價差時用追價單,停損就是當行情發展向壞的方向時出場。設停損30 點,現實未必只有損30 點的,當行情觸碰到停損點時去追價,可能損30 點以上的。limit 單則指定一個價格出場。

 

同時有停損和停利,簡潔一些可以寫成這樣:

If MP = 1 then begin

    sell next bar entryprice - STP stop;

    sell next bar entryprice + profit limit;

end;

 

If MP = -1 then begin

    buytocover next bar entryprice + STP stop;

    buytocover next bar entryprice - profit limit;

end;

 


2020年6月17日 星期三

結算日語法如何寫 --- 恆生和摩台指

恆生和摩台指的最後交易日為每月的倒數第二個工作天,要寫結算語法的話比寫台指、小道瓊、那斯達克、小SP等困難得多了! 以下我示範怎麼寫:

 

Vars:x(0),y(0);

x = dayofweek(date);

y = dayofmonth(date);

 

If date <> date[1] then SecondLastWorkingDay = false;

 

If Month(date) = 2 or Month(date) = 4 or Month(date) = 6 or Month(date) = 9 or Month(date) = 11 then begin

   If Month(date) = 2 and Mod(year(date)+1900,4) = 0 then value1 = 29;

   If Month(date) = 2 and Mod(year(date)+1900,4) <> 0 then value1 = 28;

   If Month(date) = 4 or Month(date) = 6 or Month(date) = 9 or 

      Month(date) = 11 then value1 = 30;

   end else begin

   value1 = 31;  

end;

 

 

Value2 = Mod(value1-y,7);

 

If x + value2 = 6 or x + value2 = 7 or x + value2 = 0 then begin

   If x + value2 = 6 then value3 = value1-1;

   If x + value2 = 7 or x + value2 = 0 then value3 = value1-2;

   end else begin

   value3 = value1;

end;  

     

     

If dayofweek(date) = 1 and dayofmonth(date) = value3-1 then SecondLastWorkingDay = true;

If dayofweek(date) = 2 and dayofmonth(date) = value3-1 then SecondLastWorkingDay = true;

If dayofweek(date) = 3 and dayofmonth(date) = value3-1 then SecondLastWorkingDay = true;

If dayofweek(date) = 4 and dayofmonth(date) = value3-1 then SecondLastWorkingDay = true;

If dayofweek(date) = 5 and dayofmonth(date) = value3-3 then SecondLastWorkingDay = true;

 

 

Powerlanguage Editor 裡新增一個函數SecondLastWorkingDay,函數回傳類型為True/False,儲存類型為時序再定義兩個變數 Vars:x(0),y(0);


首先計算當月有幾多天數,儲存於value1,月份1,3,5,7,8,10,12 31日,月份4,6,9,11 則有30日,至於2 月,可能是28日或29日。每四年便會出現一次2 月是29日的,如果年份可以被4整除的話,當年的2 月就有29日。例如今年2020 年,2020 可被4整除,所以今年的2 月有29 日。用Mod 這個關鍵字就能算出年份可不可以被4整除,這個關鍵字的語法是mod (被除數,除數)Year 這個關鍵字則傳回年份,它傳回的格式是ELDate的年份,例如Year(1200617) 傳回120

 

算完當月有幾多天數後,下一步計算當月最後的工作天是幾號,儲存於value3。如果當月最後一日是星期一至星期五,那麼當日便是最後的工作天 ( value1 = value3) 如果當月最後一日是星期六或星期日,最後的工作天就會提早一天  (value3 = value1-1) 或兩天(value3 = value1-2)

 

這一部份的計算會用到變數xyx = dayofweek(date); y = dayofmonth(date); dayofweek(date)傳回當天是星期幾,dayofmonth(date)傳回當天是幾號,Value2是計算當月剩餘的日子被 7 除之後的餘數,x + value2 可得出當月最後一日是星期幾,1 7 代表星期一至星期日。如果算出來 x + value2 等於1234 5,當月最後一日是星期一至五,即是當月最後一日是工作天。如果算出來 x + value2 等於 6,當月最後一日是星期六,當天不是工作天,上一天才是工作天,所以value3 = value1-1如果算出來 x + value2 等於 7,當月最後一日是星期天,當天不是工作天,上兩天才是工作天,所以value3 = value1-2

 

到這還未完結啊! 還要算出最後交易日,最後交易日為每月的倒數第二個工作天,value3 再減1。可是這只是星期一至星期四正確,星期五的話value3 要減3。因為如果最後的工作天是星期一的話,最後交易日會是3日前。

 


看完後還是不明白,可另一個寫法,就是把所有的可能性一一列出來。

語法如下,新增一個函數HSIsettlement,函數回傳類型為True/False,儲存類型為時序


var: M(0),DM(0),DW(0);

If date <> date[1] then HSIsettlement = false;

 

M=Month(Date);

DM=DayOfMonth(Date);

DW=DayOfWeek(Date);

 

If M=1 or M=3 or M=5 or M=7 or M=8 or M=10 or M=12 then begin

If DM=30 and DW=4 then HSIsettlement = true;

If DM=30 and DW=3 then HSIsettlement = true;

If DM=30 and DW=2 then HSIsettlement = true;

If DM=30 and DW=1 then HSIsettlement = true;

If DM=29 and DW=4 then HSIsettlement = true;

If DM=28 and DW=5 then HSIsettlement = true;

If DM=28 and DW=4 then HSIsettlement = true;

end;

 

 

 

If M=4 or M=6 or M=9 or M=11 then begin

If DM=29 and DW=4 then HSIsettlement = true;

If DM=29 and DW=3 then HSIsettlement = true;

If DM=29 and DW=2 then HSIsettlement = true;

If DM=29 and DW=1 then HSIsettlement = true;

If DM=28 and DW=4 then HSIsettlement = true;

If DM=27 and DW=5 then HSIsettlement = true;

If DM=27 and DW=4 then HSIsettlement = true;

end;

 

 

 

If M=2 and Mod(Year(Date)+1900,4) <> 0 then begin

If DM=27 and DW=4 then HSIsettlement = true;

If DM=27 and DW=3 then HSIsettlement = true;

If DM=27 and DW=2 then HSIsettlement = true;

If DM=27 and DW=1 then HSIsettlement = true;

If DM=26 and DW=4 then HSIsettlement = true;

If DM=25 and DW=5 then HSIsettlement = true;

If DM=25 and DW=4 then HSIsettlement = true;

end;

 

 

 

If M=2 and Mod(Year(Date)+1900,4) = 0 then begin

If DM=28 and DW=4 then HSIsettlement = true;

If DM=28 and DW=3 then HSIsettlement = true;

If DM=28 and DW=2 then HSIsettlement = true;

If DM=28 and DW=1 then HSIsettlement = true;

If DM=27 and DW=4 then HSIsettlement = true;

If DM=26 and DW=5 then HSIsettlement = true;

If DM=26 and DW=4 then HSIsettlement = true;

end;


經典當沖交易系統 --- ORB

ORB 即是 Opening Range Breakout ,意思是開盤區間突破,先定義出一個區 間 ,突破此區間進場,收盤前平倉。定義區 間 的做 法 會以當天開盤價或開盤時段的高低點作參考。例如以開盤後 30 分鐘內的最高價和最低價作為區間,突破開盤後 30 分鐘內的最高價進...