2015年6月10日 星期三

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

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

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

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

我想了一個作法出來,大家可以參考使用看看。
先寫一個函數,名稱為 _ChartSleepDetect,程式碼如下:
input: timer(Numeric);
var: intrabarpersist lastTickCounting(0), intrabarpersist AlertTimes(0);
var: errorMessage("");
array: intrabarpersist barTicks[3](0);


if LastBarOnChart and currentTime>0845 and currentTime<1330 then 
begin

 _arrayShift(barTicks);
 barTicks[1]= ticks;
 
 if barTicks[1]<>barTicks[2] then
   lastTickCounting=0
 else
   lastTickCounting = lastTickCounting+1;
 
 errorMessage= "Chart is sleeping !! "+
            FormatTime("HH:mm:ss",eltimetodatetime_s(currentTime_s));
 
 if lastTickCounting > timer and checkalert and AlertTimes=0 then begin 
   Alert(errorMessage);
   AlertTimes=1;
 end;

 _ChartSleepDetect= lastTickCounting;

end;

RecalcLastBarAfter(1);


以上程式碼援用到陣列偏移的函數,請參見:http://www.yctseng.net/2014/08/fuction.html
紅色字的部份,則可以自行界定偵測的時間範圍,以上設為 08:45~13:30


建立好這個函數之後,看你要在你本來的指標,或是另外做一個指標來引用都可。用指標,而不是在訊號中啟用,是因為我要用指標的警示功能。唯一的參數是:利用已經有幾秒鐘沒有報價進來,來當做圖表已經睡著的判斷。

引用的方法是,在某個指標中加入這一行指令,如果 60秒過去,沒有任何 tick 進來就做通報動作。


準備好指標了,我們還需要在指標設定中,把"警示"功能打開,填入 eMail 設定。


指標的 屬性 設定如下:


最後,我在盤後啟動(當然不會有 tick 進來),等著它計時後觸發...