2014年4月25日 星期五

函數(_next3rdWendnesday):距離下次週三還有幾天

第三個週五是國際上很常見的結算日,在 MultiCharts 裡就內建了個函數 Next3rdFriday(N),讓我們可以計算距離下N次的第三個週五還有幾天。只是,對於在台灣交易的人來說,第三個週三反而比較重要,而知道現在距離下次的第三個週三還有幾天並不僅僅只是用來判斷結算日而已,各人有各人的想法與用處。

本來我很天真的以為只要把 Next3rdFriday(1) 取回來的數值去減掉 2 ,就可以當做現在距離下次週三還有幾天,弄指標來看了後就會發現,代誌不是憨人想的那麼單純。有興趣的朋友可以去看看有什麼問題,為什麼不能把現在距離下次第三個週五的天數減掉 2 來作為現在距離下次第三個週三的天數?(比如 2014/05)



雖然我很討厭看人家的程式碼,不過在我沒有好好想出怎麼計算出 現在距離下次第三個週三的天數 的方式,我只好直接去看 Next3rdFriday 這個內建函數的 code,慢慢理解,然後做修改。以下就是我修改後的程式碼。希望有人那去驗證看看,是否有問題?如果這是正確的話,再去跟 Next3rdFriday 這個函數的程式碼對照,就能看出我改了哪些地方,思考一下之後,相信你要改出 第二個週四 或是別的你要計算的日子天數距離也就不是難事了。
inputs: 
    Series( numericsimple ) ;

variables: 
    var0( 0 ), 
    var1( 0 ), 
    var2( 0 ),                      
    var3( 0 ),                     
    var4( 0 ), 
    var5( 0 ), 
    var6( 0 ), 
    var7( 0 ),            
    var8( 0 ),                      
    var9( 0 ), 
    var10( 0 ) ;

                                             

var0 = DayOfMonth( Date ) ;
var1 = Month( Date ) ;
var2 = Year( Date ) ;

var3 = DayOfWeek( var2 * 10000 + var1 * 100 + 1 ) ;
if var3 < 4 then
    var4 = 4 - var3
else                       
    var4 = 11 - var3 ;

var5 = var4 + 14 ;
if var5 > var0 then
    var7 = var1 + Series - 1
else
    var7 = var1 + Series ;

if var7 > 12 then
    begin
    var7 = var7 - 12 ;
    var8 = var2 + 1 ;
    end
else
    var8 = var2 ;

var3 = DayOfWeek( var8 * 10000 + var7 * 100 + 1 ) ;
if var3 < 4 then
  var4 = 4 - var3
else if var3 >= 4 then
  var4 = 11 - var3;
var6 = var4 + 14 ;
var9 = DateToJulian( var8 * 10000 + var7 * 100 + var6 ) ;
var10 = DateToJulian( Date ) ;

_next3rdWendnesday = var9 - var10 ;




做個指標 plot1( _next3rdWendnesday(1) ) 放到圖表上去看看,是否正確? 2014年4月的第三個週三在 04/16 所以 2014/04/15 這天,距離下1次週三的天數就是 1。而寫文的今天是 201/04/29,下1次的第三個週三在 2014/05/21,看一下指標圖上最新數值是 22 ,表示還有 22天,是對的嗎?



這個函數我就有用來作為選擇權上的運用,比如:下單的月份。給定一個規則,結算日前五天以前的上半場下當月合約,之後下次月。當然會需要一些程式上的控制設計,以指標來顯現它的效果: