顯示具有 函數 標籤的文章。 顯示所有文章
顯示具有 函數 標籤的文章。 顯示所有文章

2025年5月3日 星期六

函數:字串取代


在 MultiCharts 上對字串處理的內建函數有大、小寫互換、LeftStr、MidStr 等等,缺了在字串中指定字串更換的功能,也就是一般所謂的 String Replace。就... 做一個來用吧。


字串型函數,名稱:ˍStrReplace(參數1, 參數2, 參數3)

參數1:要被處理的字串
參數2:字串中要被更換掉的字元
參數3:字串中要更換成的字元

以下是效果範例:


這是函數的 code:

input: inputStr(string), Str_Find(string), Str_Replace(string);

var: resultStr(""), position(0), lenFind(0), tempStr("");


resultStr = inputStr;
lenFind = StrLen(Str_Find);

if lenFind > 0 then begin
  position = InStr(resultStr, Str_Find);
  while position > 0 begin
    tempStr = LeftStr(resultStr, position - 1) + Str_Replace + 
              RightStr(resultStr, StrLen(resultStr) - position - lenFind + 1);
    resultStr = tempStr;
    position = InStr(resultStr, Str_Find);
  end;
end;

_StrReplace = resultStr;


2019年5月26日 星期日

函數(WOptionWeekth):台指週選擇權的第幾週


這個函數將會傳回目前 Bar 所屬時間的週選擇權的第幾週合約,正常來說是 1~5。也就是下圖中圈起來的這個數字。



2018年9月27日 星期四

函數(_priceTWS):適應台股最小跳動的價格轉換


台灣股票的最小跳動間距,算是自外於國際現況,會因為股價高低而有不同的最小跳動,相關規則可參考:https://dh3p7.app.goo.gl/vBs5

這個函數的用途在於,我們在編寫交易策略的時候,常常會有指定價位的 stop 或是 limit 交易指令,如果我們指定的價格(比如:往上碰到5日均線時買進,往下觸到布林通道下緣出場)沒有經過處理轉換,又剛好下單機是採掛價送單的話,就會出現掛價不存在而遭退單。

就算你是看股票現貨做股票期貨也是一樣的狀況,所以,我們會需要一個函數來幫忙把指定價格轉換成在該價格對應到符合最小跳動規格的正確數字。


2018年7月2日 星期一

函數(_isSettlementDay):多商品版結算日判斷


這篇文章的緣由有兩個,一是這個函數能比較多的適用在不同商品的結算日判斷,二是應該還有許多人對於在函數中的參數對宣告成 Reference 型態的使用感到疑惑。

本文所分享的函數 code 原作不是我,出處來自:https://goo.gl/7Nni3p 的第三樓。
感謝 Vincez 的分享,原始 code 請自行連過去閱讀。


2018年2月4日 星期日

函數(_isTrading):判斷商品當下是否有在交易中


由於正在往國外期貨做更多的努力,也陸陸續續碰到很多問題,維運方面或是策略、管理對不同市場、商品的自動適應都有。

這是為了在做出下單動作的時候,先判斷一下目前該商品,是否處於可交易的狀態?因為我自己已經發生多次,輸出部位的文字檔改變了,卻在該商品沒有交易的時段 XDDD


函數: _isTrading。回傳:True / False。
var: intrabarpersist volToday(0), intrabarpersist volUpdateTime(0),
     intrabarpersist TimeValue(0), intrabarpersist isTrading(false);


if LastBarOnChart then begin
  
  value1= currentTime_s;
  value2= HoursFromDateTime( ELTimeToDateTime_s(value1) );
  value3= MinutesFromDateTime( ELTimeToDateTime_s(value1) );
  value4= SecondsFromDateTime( ELTimeToDateTime_s(value1) );
  TimeValue= value2*3600 + value3*60 + value4;
  
  once volToday= q_ask*q_bid + q_totalvolume; 

  if (q_ask*q_bid+q_totalvolume) <> volToday then begin
    volUpdateTime= TimeValue;
    volToday= (q_ask*q_bid+q_totalvolume);
  end;
  
  _isTrading= TimeValue-volUpdateTime < 60 and volUpdateTime <> 0 
              and q_bid*q_ask <> 0 and q_bid <> q_ask;

end;


2017年12月19日 星期二

函數(_commaFormat):讓數字以千分位形式顯示


在製作介面的時候,有關於資金量的顯示,如果是短短的萬元以下,通常我們的人眼辨識沒有什麼問題,當數字位數多一些起來時,往往就會有辨識解讀的困擾(這是一種略帶快樂的麻煩嗎?)

然而 MultiCharts 內建的數字顯示形式的功能,我只看到 :7:0 這類的方式,好像沒有看到以千分位加個逗號的形式?因此,自己就做了個函數,在數字最後要顯示在畫面上時,可以用千分位加逗號的文字型態來表現。


2017年9月29日 星期五

函數(_fancyDailyEquity):爽歪歪版日權益


在開發交易管理系統的早期,我注意到給策略做評價的 KPI 計算出來的分數會出現負數,而負數的出現自然是被評估的那個策略實在太爛的關係。然而所謂的策略績效表現太爛,通常不是策略訊號本身就衰到爆,卻往往是交易成本(稅、費、滑價)把訊號本身的價差獲利吃乾抹淨所致。也就是我常在講座、課程中提到的:我們手上策略賺不了錢的絕大部分原因,是被賭場抽頭給抽死的。

近期,好友(就是凌波微步大)與我討論到把賠到不行的策略對做這件事(他也有發文講這事)。真的要做的話,我們第一件要做的事情就是先把策略績效中的交易成本因素剔除。

由於我們還打算跟超級爛策略對做(你叫多單,我就下空單),所以最好把策略績效修改成,每做一筆交易就算平出也能拿到獎金,如果在這種條件下,還能做到賠錢,那真無疑是地獄倒楣鬼:一空就漲、一多就跌。因此,我先寫個函數來把原始策略績效改成剔除交易成本還附送獎金,產生負面評估的原始材料。


2017年3月31日 星期五

函數(_OptimalF):Optimal F


說起資金管理,大約都會耳聞過 Kelly formula,也會聽過它其實用在交易上的問題很大。後來有以 Kelly 精神生出了 Optimal F。而它的來由與計算方法,我就不多贅述,請自行參考:牧清華的文章

要把 Kelly formula 寫成 MultiCharts 函數在策略中或是其他引用,算是一小片蛋糕。這一篇要分享的是,我一開始看了牧清華介紹,覺得計算很麻煩的 Optimal F。


2017年1月28日 星期六

函數(_MonthlyProfit):過去第N個月的當月損益


這一篇文章根本就是用過去的一篇來做的修改,算是相同邏輯下的不同週期切割而已。

做個函數來取得以月為單位的損益數值。
函數名稱:_MonthlyProfit,參數 為 monthsAgo。參數輸入 0 可取得這個月的損益變化,輸入 1 則是上個月,2 則是上上個月... and so on。

函數(
數值、序列)程式碼如下:
input: monthsAgo(Numeric);
var: equity(0);
array: monthEquity[](0);


equity= i_OpenEquity;
array_setmaxindex(monthEquity, monthsAgo+1);


if month(D)<>month(D)[1] then
begin
  _arrayShift(monthEquity);
  monthEquity[1]= equity[1];
end;


if monthsAgo=0 then
  _monthlyProfit = equity - monthEquity[1]
else
  _monthlyProfit = monthEquity[monthsAgo] - monthEquity[monthsAgo+1];


效果:



2016年4月22日 星期五

函數(_highSession):最近第N個交易時段的日線最高價


在上一篇文章(http://www.yctseng.net/2016/04/n.html),我們有了正確計算目前 K棒是該交易時段內的第幾根,接著要來引用它做出取代 highD(N) 的函數:抓取最近第N個交易時段的最高價,名稱: _highSession(N),參數:第N個交易時段,回傳值類型:數值。


函數(_NthBarInSession):交易時段內的第N根


好些開發策略應用在台指時的常用簡單觀念與寫法,轉進國外期貨的時候常常會發現一堆奇奇怪怪的狀況出現,比如:我想知道最近第幾天前的高點的價位。在台灣,交易時段的時間不會出現跨日的狀況,但是現在沒有不保證未來不會有呢。當我要知道昨天日線的最高點,通常就直接引用內建函數 highD(1),一點問題都沒有。但是國外期貨呢?


2016年4月16日 星期六

函數(_Decimal2Binary):十進位轉二進位


緣起於某位參加我課程的同學來信問我的問題:要如何以最佳化的方式測試各種不同出場方法的組合可能?(實際內容就不在這邊贅述了)。一開始,我們用了 Switch... case 的方式去做,透過 case 的數值來做最佳化,以最佳化的方式去做,是為了大量測試。但這只能得擇一的測試結果。於是,我想到了可以用二進位的方式來做!

我們可以指定一個參數值,用這個參數值去跑最佳化,但把參數值轉換成二進位表示,然後以二進位表示中,逐位數的 0 與 1 作為待測試出場方法的...開關。這樣做,就可以大量測試各種你想得到的出場方法去做組合,甚至把各種出場方法內使用不同的參數一併做測試了。於是,我們就需要一個把十進位轉成二進位的函數了。


2015年7月18日 星期六

函數(_readFile):讀取文字檔_利用ELCollections.dll


在 MultiCharts 中要把一些所需的資訊輸出出去,存成文字檔(.txt)的形式,內建於 MultiCharts 的 fileappend 與 print 指令都能順利辦到。另外,國內有凌波大分享的 outputfile.dll 與 下單大師的 omSignTXT.dll 可供使用,更能提供比內建指令更好的穩定性,避免檔案讀取權限被鎖住的問題。

但是從外部文字檔讀取資訊進來給 MultiCharts 使用,就沒有內建的指令可以使用了,在凱衛官方網站上,有網友 bodrigs 分享自製工具,我有使用一段時日,但是如果欲讀取文字檔不存在的話,會導致整個 MultiCharts 整個 crash 掉,算是使用該資源的一項風險。其後,又有網友 swwang1999 分享相同功能的資源,說是即使讀取文字檔失敗,也不會造成 MultiCharts 當掉。不過,幾經實驗,我依然不得要領。


2015年6月10日 星期三

函數(_ChartSleepDetect):圖表睡著的通報


每每在課程中講到程式交易的一般障礙自動自我救援的時候,我說出 MultiCharts 其實時不時還是會有圖表報價"睡著"的意外發生時,同學幾乎都是一副不可思議的表情。是的,圖表會睡著!是睡著,不是死掉,不是當掉,也不是斷線...

一般來說,如果報價中斷或是網路斷線,在 MultiCharts 上所有圖表的報價就不會跳了。但是,在我多年的使用經驗上,實際上多次發生好幾個圖接收同一個商品報價,卻只有其中某一個圖的報價不會跳,而其他圖表的報價依然在跳動,這證明了網路沒斷、報價有進來,僅僅只有那個不跳報價的圖表昏過去了(難道是賠太多嗎 XD)。這狀況其實很嚴重啊!因為不是報價中斷,不會觸發 Multicharts 本身的自動重連或是自動回補機制,只有那個圖表遺世獨立而已...

在我的自動救援機制中,自有其應對之道。但我還想進一步知道到底是哪一個圖表睡著呢?


2015年5月16日 星期六

函數(_bankerRound):四捨六入五成雙


MultiCharts 內建函數的 Round 是大家所熟知的四捨五入去到小數點以下幾位。但是,Round 這個幾乎所有程式語言都有的內建函數,卻不見得在每個語言中都是四捨五入喔。至於,什麼是"四捨六入五成雙"?可以查一下 banker's rounding。這裡有些不同 round 方式的介紹:http://goo.gl/gTpp9b


2015年4月21日 星期二

函數(_xAverage_a): 一維陣列用的EMA


個人在平均值,尤其是均線上的計算使用,對 EMA(即 xAverage)的偏好大於 MA(即 Average)。在 MultiCharts 內建函數中對於一維陣列的平均計算有 Average_a 或是 AverageArray 可用,但找不到以 EMA 方式對一維陣列按序號遞增做 EMA 計算的函數...


2015年1月31日 星期六

函數(_SortinoRatio):索丁諾比率 by 日權益


上回做了用來比較策略表現品質的 Sharpe Ratio 值的計算函數
這回,我們來計算 Sortino Ratio。什麼是 Sortino Ratio?請看:http://goo.gl/VrrRF8。而 Sortino Ratio 與 Sharpe Ratio 的差異,主要就在不把賺錢的波動當做風險,而只把賠錢的波動程度視為風險。

從該介紹的解說來看,似乎只是把 Sharpe Ratio 中計算標準差的部份,改成只有計算賠錢的而已。因此,我直接把 _SharpeRatio 這個函數拿來修改成如下,差異就在藍色的部份。函數名稱: _SortinoRatio,參數值三個,依序是計算近幾日、是否再投資模式、起始資金。

2015年1月10日 星期六

函數(_SharpeRatio):夏普比率 by 日權益


在 MultiCharts 的回測報表中,有一個欄項,策略分析-績效比率,項下有一個叫做夏普比率的東西,也就是 Sharpe Ratio。我看了它的說明,好像有點懂又不大懂,找了 Google 到的資料,其實我還是不大清楚怎麼算。而為什麼想要算這個呢?因為它可以用來做為各個策略間的績效優劣指標的比較。其實 MC 有內建這個函數,名稱就是 SharpeRatio。只是,我試了多次... 它給我回傳的數值,總是...零! T_T


2014年10月31日 星期五

函數(_daysLeftMonth):今天距離月底剩幾個交易日


朋友問我怎麼在 MultiCharts 寫出如標題的功能?到目前為止,其實我搞不定這個功能... 但是,做了接近的 fuction。

希望能有人分享出比較好的計算規則,讓我來寫看看。

我現在的作法是利用 Julian 格式做一下日期的轉換,計算今天到月底總共有幾天,比如 7月15日到 7月底會有16天,再減去今天到月底這段日子有幾天是週六或週日,來得到今天距離月底還剩下幾個交易日。這其實不是個完美的邏輯,只要從今天到月底中間有任何一天的週一到週五之間有放假就會算錯,有或者週六要交易(台灣特有?),也會算錯。

請建立一個數值型的 Fuction,名稱為 _daysLeftMonth,code 如下:
var:now(0),j(0),days2MonthEnd(0),holidays(0);

now=datetojulian(D);

holidays=0;
days2MonthEnd=0;
for j=1 to 50
begin

  if Month(JulianToDate(now+j)) > Month(D) or 
     Year(JulianToDate(now+j)) > Year(D) then 
  begin
    days2MonthEnd=j-1;
    break;
  end;

  if dayofweek(JulianToDate(now+j))=6 or 
     dayofweek(JulianToDate(now+j))=0 then 
    holidays=holidays+1;

end;


 _daysLeftMonth= days2MonthEnd - holidays; 


然後,我用 Print 試了一下,效果如下圖:


2014年8月12日 星期二

函數(_arrayShift):陣列偏移


在某些情況中,我們會需要把陣列的數值做偏移的動作。而這個偏移指的是什麼呢?簡單的用 Excel 做了個示意圖,希望幫助你了解。我要把原陣列的數值如下圖所示的那樣,讓每個位置的值,往右移動 1 格,這就是我在這裡說的陣列偏移。以下圖的示範,這是偏移了 1 格,有的時候,我們可能需要偏移不同的格數。



熱門文章