2015年7月31日 星期五

訊號:收盤前平倉(當沖專用)

最近又看到人家在問,想要在收盤時平倉。在 MultiCharts 上,實際上是做不到收盤"時"平倉的,因為當真的收盤的時間一到,不管你的下單機有多快,委託單送出得到的回報必然只有一個:拒絕委託,非交易時間。

而在 MultiCharts 用來作為每天的收盤清倉的指令:SetExitOnClose,實際上是個僅供"回測"的指令,這個指令是無法用在盤中驅動買賣動作的。只要花點時間去觀察就知道,盤中報價持續跳著,即使你在訊號程式碼中下了 SetExitOnClose,但到了 13:45(TXF為例),它就是不會產生平倉訊號,我們得把圖表關掉重開,才會看到平倉訊號出現。



那麼,實際上我要在臨收盤前把部位清掉的話,該怎麼做呢?得獨立做一個訊號,專門來幹這件事,它必須開啟 IntrabarOrderGeneration 模式,只下平倉命令,沒有進場命令,訊號程式碼如下:
[IntrabarOrderGeneration = True]


input:exitTime( 134457 );
var:cleanTime(0), now(0), realTiming(false), toClean(false);

if LastBarOnChart then begin

  now= currentTime_s;
  cleanTime= iff( _Checkday, exitTime-1500, exitTime );
  realTiming= now>=cleanTime and now<=134500;
  toClean= realTiming and Time_s>=cleanTime;

  if toClean then begin
    if marketposition>0 then Sell (" clean ") next bar market;
    if marketposition<0 then Buytocover ("clean") next bar market;
  end;

end;

RecalcLastBarAfter(1);

訊號的參數是到秒格式的指定時間,時間一到要做平倉出場動作,以上 code 預設值是 13:44:57 。通常來說以國內的下單機速度,3 秒鐘應該足夠用來委託的送達了,如果你擔心這樣的時間太緊迫或有個人喜好的話,自行調整參數去控制出場的指定時間。另外,因為結算日當天會提早 15分鐘收盤,所以我把執行出場時間在結算日當天自動減去 1500。

基於通常對盤中特定時間控制用 Q_time_s 來做,有可能因為臨收盤前各種原因沒有收到任何報價的 tick,因而無從發生 event 推動出場動作。所以,我特意採用 currentTime_s 並且搭配 ReCalcLastBarAfter ,直接讀取本端電腦時間去產生出場訊號,相對來說適應性更高。

在你做好了這個專門用來給當沖程式的指定時間到就強迫清倉出場的訊號後,需要把這個訊號跟你的當沖程式放在同一個圖表上,並作設定如下圖: