2019年11月4日 星期一

★趨勢線指標及策略(含程式碼)

     當我們在用撰寫程式交易策略的時候,為了方便,經常會使用近期的高低點作為突破型策略的進場點,但隨著程式交易的人口增加突破近期高低點才追價進場太慢了,而且很容易滑價。所以今天跟大家分享一個趨勢線指標,簡單來說就是藉由近期高點或低點的連線,來作為突破點,就跟老派的分析師一樣,在K線圖上畫線,當出現突破的時候,就直接追價。只是要把這種趨勢線寫進程式交易並不容易,也因為這個原因,寫出來的策略進場點常常可以跟大家不一樣,用來分散突破型策略的滑價風險也是一個選擇。

日圓期貨使用趨勢線突破進場的示意圖



   要畫趨勢線最簡單的方法就是拿起一支筆,在K棒上把波峰的高點相連,或近期波谷的低點相連,延伸出去的那條就是趨勢線了,這種型態的指標用手畫很簡單,但是要把它寫成程式碼就很頭痛了,為了要方便在程式中使用,我把趨勢線寫成了函數,提供給讀者學習。然而趨勢線的畫法很多,在國外論壇可以買更精美的程式語法,只是不見得合自己胃口。

我今天分享的是一種簡單的畫法,單純使用近期波峰及波谷的連線作為趨勢線,因為畫法很簡單,有興趣的人可以自行修改開發出成交量突破等不同用法。

當然如果不加任何濾網的話,趨勢線有時候也會在不適當的時候進場,例如遇到旗形收斂之後,壓力線常常會跑到支撐線下方,這個時候可能就會造成進場訊號的錯亂,因此實際運用在交易訊號的話,還是需要加上適當的濾網

=================================================

★趨勢線函數程式 TL_Function的程式碼如下: (把下面這段寫在函數中)

input:PriceValue(NumericSeries),
      Length(NumericSimple),
      UpOrDn(TrueFalse),
      ShowTrendLine(TrueFalse),
      SetColor(NumericSimple);

var:MA(0),Tri(0),Slope(0),
    Tri1Bar(0),Tri3Bar(0),
    Tri1Date(0),Tri3Date(0),
    Tri1Time(0),Tri3Time(0),
    Tri1Price(0),Tri3Price(0),flag(0);
//var:NodPt(0);
/////=====Up Triangle=======/////
if UpOrDn=true then begin
MA=highest(PriceValue,Length);
flag=0;
switch Tri begin
   case 0:
          if MA<MA[1] then begin
             Tri=1;
             Tri1Bar=currentbar-Length;
             Tri1Price=PriceValue[Length];
             Tri1Date=d[Length];
             Tri1Time=t[Length];
          end;
   case 1:
          if MA>MA[1] then begin
             Tri=2;
          end;
   case 2:
          if MA<MA[1] then begin
             flag=1;
             Tri=1;
             Tri3Bar=currentbar-Length;
             Tri3Price=PriceValue[Length];
             Tri3Date=d[Length];
             Tri3Time=t[Length];
             Slope=iff(Tri3Bar-Tri1Bar=0,0,(Tri3Price-Tri1Price)/(Tri3Bar-Tri1Bar));
             if ShowTrendLine=true then begin
                value1=tl_new(Tri1Date,Tri1Time,Tri1Price,Tri3Date,Tri3Time,Tri3Price);
                tl_setcolor(value1,SetColor);
             end;
             Tri1Bar=currentbar-Length;
             Tri1Price=PriceValue[Length];
             Tri1Date=d[Length];
             Tri1Time=t[Length];
//             NodPt=Tri1Price;   
//             text_new(Tri1Date,Tri1Time,Tri1Price+20,NumToStr(NodPt,0));
             end;
end;
end;
  
/////============Dn Triangle============/////
if UpOrDn=False then begin
MA=lowest(PriceValue,Length);
flag=0;
switch Tri begin
   case 0:
          if MA>MA[1] then begin
             Tri=1;
             Tri1Bar=currentbar-Length;
             Tri1Price=PriceValue[Length];
             Tri1Date=d[Length];
             Tri1Time=t[Length];
          end;
   case 1:
          if MA<MA[1] then begin
             Tri=2;
          end;
   case 2:
          if MA>MA[1] then begin
             flag=1;
             Tri=1;
             Tri3Bar=currentbar-Length;
             Tri3Price=PriceValue[Length];
             Tri3Date=d[Length];
             Tri3Time=t[Length];
             Slope=iff(Tri3Bar-Tri1Bar=0,0,(Tri3Price-Tri1Price)/(Tri3Bar-Tri1Bar));
             if ShowTrendLine=true then begin
               value2=tl_new(Tri1Date,Tri1Time,Tri1Price,Tri3Date,Tri3Time,Tri3Price);
               tl_setcolor(value2,SetColor);
             end;
             Tri1Bar=currentbar-Length;
             Tri1Price=PriceValue[Length];
             Tri1Date=d[Length];
             Tri1Time=t[Length];
//             NodPt=Tri1Price;
//             text_new(Tri1Date,Tri1Time,Tri1Price-20,NumToStr(NodPt,0));
             end;
end;
end;

Function_TL=(currentbar-Tri1Bar)*Slope+Tri1Price;
if ShowTrendLine=true then begin
   if flag=flag[1] then begin
     value3=tl_new(d[1],t[1],Function_TL[1],d,t,Function_TL);
     tl_setcolor(value3,setcolor);
   end;
   if Tri[2]=2 and Tri[1]=1 then begin
     value4=tl_new(Tri3Date,Tri3Time,Tri3Price,d,t,Function_TL);
     tl_setcolor(value4,setcolor);
   end;
end;





=================================================
在這裡簡單說明一下,Function_TL的參數共5個:

(1)   PriceValue是要取峰谷值的value,通常壓力線在上方,所以會取high,支撐線在下方,所以會取low。當然也可以將成交量或是RSI這些指標餵給Function_TL運算。
(2)   Length用來調整趨勢線的敏感度,也就是峰值highest(h,len)或谷值lowest(l,len)裡面的那個len
(3)   UpOrDn是用來選擇我們是要峰峰相連還是谷谷相連,像壓力線是峰峰相連,就用true,支撐線是谷谷相連就用false
(4)   ShowTrendLine這個只是用來控制要不要把相連的壓力線和支撐線畫在圖表上,一般交易的時候都用false關掉,以減少資源的耗用。
(5)   SetColor是設定畫出來的線的顏色,當然如果ShowTrenLinefalse的話,這個參數就沒有用了,隨便設一個就可以。



參數設定範例(如下圖),如果要計算UpTrend(壓力線)PriceValue=hLength=6UpOrDn=true表示峰峰相連,ShowTrendLine=false表示不要將線畫出來,SetColor=red表示如果畫線的話,線用紅色畫出。同理DnTrend(支撐線)也是一樣。計算出來的UpTrend就是這當根K棒的壓力價位,而DnTrend則是算出當根K棒的支撐價位。


趨勢線可以運用在很多地方,有時候也可把它拿來用在算成交量的突破位置,要怎麼用就看大家的想像力了。

下圖為台指期使用趨勢線函數指標的情形,為了讓圖表看起來比較乾淨,我只打開近期高點連線的UpTrend(如圖中紅線)。在使用上我很可能會將高點的連線視為價格壓力區,用簡單的順勢策略突破壓力作多 。






另一個例子,下圖為恆生指數期貨,我只開啟DnTrend (支撐線,如圖中黃線),在大多時候,支撐線的跌破意味著行情轉弱,如果是順勢交易的概念就可以跌破就放空,如果是長線投資的話,很可能是個低接的買點(因為過去十幾年的交易經驗告訴我,股市作多好像比較容易,跌破支撐就作多的勝算滿高的)



以上僅供教學使用,程式碼皆為範例,請勿直接使用於交易。


後記:

程式碼都提供了,有點基礎的人稍加濾網,要寫出個策略應該很容易了。大家自己研究研究吧。就不再提供策略程式碼了。


●CME的日圓期貨,回測如下:
手續費及滑價:每口USD$15
交易期間:2007/3/13~2019/10/18 (資料經修正換月價差)
K棒週期:120K (24/7)





●台指期(TXF)回測如下:
手續費及滑價:每口$500
交易期間:1998/7/22~2019/10/18 (修正換月價差)
K棒週期:120分K (08:45~13:45)







0 留言:

張貼留言

如果有私人問題想請教,請透過網站右方『與站長聯絡』之表單,謝謝!

----------------------------------------------------------------------------------------------------
網站聲明(Disclaimer)
本教學網站內所提供之程式碼(包括函數、指標、訊號)屬開放程式碼,用意在於讓使用者學習程式語法之撰寫,使用者可以任意修改語法內容並調整參數。本網站所有之內容(包括文章、影片、歷史紀錄、程式碼、教材)限用於個人學習使用,請勿轉寄、濫用,嚴禁私自串接帳戶交易。
-------------------------------------------------------------------------------------------------