顯示具有 MultiCharts使用心得_程式篇 標籤的文章。 顯示所有文章
顯示具有 MultiCharts使用心得_程式篇 標籤的文章。 顯示所有文章

2017年9月1日 星期五

MultiCharts程式篇:如何避免台指T盤的委託單在T+1盤成交

 

MultiCharts程式篇:如何避免台指T盤的委託單在T+1盤成交

 

 

1-K線圖沒報價進來但交易追蹤視窗卻還在送委託單




  • 若只想操作T盤


根據凱衛官網的教學,若只想接T盤的報價必須在圖表裡的交易時段作下圖的設定:



但其實仔細觀察交易追蹤視窗時會發現,沒有報價進來但卻依舊會送委託單,且若T+1盤的價格碰到了委託單,那還真的就會丟單至券商了,沒意外價格碰到的話就應該就會成交。



  • 方法一:在下單機設定強迫清除委託(國內)


本以為在下單機作強迫清除委託可以避免到這狀況,但結果是依下圖14:50清盤,那下一根K線一樣會再送出委託,所以這方法失效,這應該算是下單機的bug,因為沒接報價進來就應該當成收盤的狀態,不應會再有符合某條件而送出委託單的情況。




















  • 方法二:下單條件加上時間判斷

試著在程式裡下單的地方(進出場都要)加上時間的判斷,如下:

if time >= 0845 and time <= 1350 then
begin
     下單指令;
end;


結果這方法還是gg,無效。


  • 方法三:將台指商品的交易時間改成只有T盤
把台指商品的交易時間都改成只有T盤08:45~13:45,測試結果也沒用。

























  • 方法四:T盤收盤後重開MC
在13:45收盤之後把MC重開一次,測試結果是有用的,不會在T+1的時間再送委託單。


  • 結論
這個問題應該是個bug,就看什麼時候解決了。


  • 10/14補充
原廠代理凱衛於2017/10/11發文解決:依照下面官方文章的說法更新行情及下單元件就可以解決了。

還有個只交易T盤的設定























此版本為MultiChart64 9.0專業版。

P.S:本資料僅供參考,使用者依本資料交易發生交易損失需自行負責,本人對資料內容錯誤或更新延誤不負任何責任。

2014年11月10日 星期一

MultiCharts程式篇:如何抓到加碼單K棒的開高低收-PosTradeEntryBar

 

MultiCharts程式篇:如何抓到加碼單K棒的開高低收-PosTradeEntryBar

 

 

1-就我所知沒有現成的函數可用




  • 用每根加碼的K棒編號倒推


部位一旦出現了加碼,程式就會變的比較複雜,若想取得加碼單那根K棒的開高低收則可以用PosTradeEntryBar(PosAgo,TradeNumber) 這個關鍵字,下面的範例大家可以參考一下,要注意的是這個關鍵字取回來的K棒編號跟CurrentBar一樣,是從策略運算最大使用K棒數量(此範例設定100)後下一根起算。




















此範例部位共有6口,若要抓倒數第二口(第5口)的開高低收,則使用PosTradeEntryBar(0, 4),這口單是2014/11/07 10:25進場,若時間停在11:00時,程式碼和輸出結果如下:
程式碼:


vars:theBarNum(0);

if PosTradeEntryBar(0,4) > 0 then
begin
theBarNum = currentbar - PosTradeEntryBar(0,4);
end;

print("date = " , date, " time = ", time, " open = ", open[theBarNum]  , " high = ", high[theBarNum], " low = ", low[theBarNum], " close = ", close[theBarNum] );




輸出值:


date = 1141107.00 time = 1100.00 open = 8891.00 high = 8908.00 low = 8884.00 close = 8908.00





此版本為MultiChart 8.5。

P.S:本資料僅供參考,使用者依本資料交易發生交易損失需自行負責,本人對資料內容錯誤或更新延誤不負任何責任。

MultiCharts程式篇:CurrentBar的注意事項

 

MultiCharts程式篇:CurrentBar的注意事項

 

 

1-圖表裡的K棒編號與CurrentBar回傳的不同




  • 差在策略運算最大使用K棒數量


在圖表裡每一根K棒都有一根編號,如下圖:





當你使用CurrentBar印出K棒編號的時候卻跟圖上看到的不同,原因差在CurrentBar的第一根是從下圖的策略運算最大使用K棒數量後下一根起算,以下圖的設定為例,圖表裡的第51根才是CurrentBar的第一根。



























此版本為MultiChart 7.4.20.400。

P.S:本資料僅供參考,使用者依本資料交易發生交易損失需自行負責,本人對資料內容錯誤或更新延誤不負任何責任。

2013年7月2日 星期二

MultiCharts程式篇:如何畫出不同的K線

 

MultiCharts程式篇:如何畫出不同的K線

 

 

1-以台指TX為例


  • 引線顏色與K線實體相同


若想畫出不同的K線,可使用PlotPB這指令達成目的,例如想畫一個引線與K線實體相同顏色的K線,這裡提供一個簡單的作法。


程式碼:

if close > open then
begin
PlotPB(high, low, open, close, "", Red);
end
else if close < open then
begin
PlotPB(high, low, open, close, "", Green);
end
else
begin
PlotPB(high, low, open, close, "", lightgray);
end;














說明:

上半部是原來的K線,下半部是自己畫的K線。


此範例程式只是提供簡單的想法,大家可以參考並延伸其它解法方案。









此版本為MultiChart 7.4.20.400。

P.S:本資料僅供參考,使用者依本資料交易發生交易損失需自行負責,本人對資料內容錯誤或更新延誤不負任何責任。


2013年5月22日 星期三

MultiCharts程式篇:如何在K線走勢圖顯示相對高低點的程式處理

 

MultiCharts程式篇:如何在K線走勢圖顯示相對高低點的程式處理

 

 

1-以英鎊BP為例


  • 顯示一個高點及低點


有用過寶來財富888的人應該知道走勢圖可以顯示相對高低點,那MultiCharts能不能作到呢,當然可以,而且彈性還更大,因為一切都可以自己來控制。














這裡提供一個簡單的作法去顯示一段區間內的高低點。


程式碼:

inputs:len(30),showLocation(3);
 
if high = highest(high,len) then
begin
if value1 = 0 then
begin
value1 = text_new(date,time,high,numtostr(high,0));
end
else
begin
text_setstring(value1,numtostr(high,0));
text_setlocation(value1,date,time,high + showLocation);
end;
end;


if low = lowest(low,len) then
begin
if value11 = 0 then
begin
value11 = text_new(date,time,low,numtostr(low,0));
end
else begin
  text_setstring(value11,numtostr(low,0));
  text_setlocation(value11,date,time,low - showLocation);
end;
end;

















說明:

1.參數len(30):取n根K棒的高低點。
2.參數showLocation(3):高點的文字顯示在高點加n的位置,低點的文字顯示在低點減n的位置。


此範例程式只是提供簡單的想法,還有小細節需要處理,例如:目前只顯示一個高點和低點,大家可以參考並延伸其它解法方案。





此版本為MultiChart 7.4.20.400。

P.S:本資料僅供參考,使用者依本資料交易發生交易損失需自行負責,本人對資料內容錯誤或更新延誤不負任何責任。


2013年5月8日 星期三

MultiCharts程式篇:國外期貨非換日時間的程式處理(包含夏令及冬令時間判斷)

 

MultiCharts程式篇:國外期貨非換日時間的程式處理(包含夏令及冬令時間判斷)

 

 

1-以英鎊BP為例




  • 使用交易所時間


資料時間預設為交易所時間就沒有換日問題,細節可以參考另一篇文章 "MultiCharts基礎篇:國外期貨資料時間的儲存、顯示和輸出的比較"。




  • 使用本機時間


若換成台灣時間,程式要如何處理24小時的商品時間過了凌晨12點,但其實是同一個交易日的問題呢,先將資料日期改成台灣時間。
























這裡提供一個簡單的作法去判斷台灣時間所認定的交易日。


程式碼:


vars:isSummer(true), theLastDate(0), theMins(5)
, summerTimeS(0000), summerTimeE(0500)
, winterTimeS(0000), winterTimeE(0600);




if time - time[1] >= 100 and time = 0600 + theMins then
begin
isSummer = true;
end
else if time - time[1] >= 100 and time = 0700 + theMins then
begin
isSummer = false;
end;

If isSummer and time >= summerTimeS and time <= summerTimeE then
Begin
theLastDate = julianToDate(dateToJulian(date) - 1);
End
else If not isSummer and time >= winterTimeS and time <= winterTimeE then
Begin
theLastDate = julianToDate(dateToJulian(date) - 1);
End
else
Begin
theLastDate = date;
End;


condition1 = date <> theLastDate;


if condition1 then
begin
print("date = " , date, " time = ", time, " isSummer = ", isSummer, " theLastDate= " , theLastDate, " is last day ");
end
else
begin
print("date = " , date, " time = ", time, " isSummer = ", isSummer, " theLastDate= " , theLastDate, " is not last day ");
end;




輸出值:


date = 1130504.00 time =  450.00 isSummer = TRUE theLastDate= 1130503.00 is last day
date = 1130504.00 time =  455.00 isSummer = TRUE theLastDate= 1130503.00 is last day
date = 1130504.00 time =  500.00 isSummer = TRUE theLastDate= 1130503.00 is last day
date = 1130506.00 time =  605.00 isSummer = TRUE theLastDate= 1130506.00 is not last day
date = 1130506.00 time =  610.00 isSummer = TRUE theLastDate= 1130506.00 is not last day
date = 1130506.00 time =  615.00 isSummer = TRUE theLastDate= 1130506.00 is not last day



說明:

1.夏令及冬令時間判斷:簡單的說就是判斷收盤後的第一根K棒時間是6或7點。
2.非換日判斷:簡單的說就是將跨日後到收盤的日期用一個變數設定成前一天。

此範例程式只是提供簡單的想法,還有小細節需要處理,例如:若收盤後第一根時間不是0605或0705(少資料或調整交易時間),或遇到假日等問題就會有狀況,大家可以參考並延伸其它解法方案。




此版本為MultiChart 7.4.20.400。

P.S:本資料僅供參考,使用者依本資料交易發生交易損失需自行負責,本人對資料內容錯誤或更新延誤不負任何責任。

2013年4月14日 星期日

MultiCharts程式篇:EntryPrice和EntriesToday使用在加碼上的問題與解決方式

 

MultiCharts程式篇:EntryPrice和EntriesToday使用在加碼上的問題與解決方式

 

 

1-傳回指定部位第一筆進場的價格




  • EntryPrice永遠是第一筆


一開始看到"傳回指定部位第一筆進場的價格"還不太懂是什麼意思,一直用TradeStation的想法來思考,直到用了加碼時才發現怪怪的,用下圖為例,以TradeStation來說2013/04/12的11:30有6口單,進場價依序為(1)7825 (2)7821 ....,則 EntryPrice(0) = 7821,EntryPrice(1) = 7825以此類推,但MultiCharts裡卻不是這樣,EntryPrice(0) = 7825,EntryPrice(1) (編號3) = 7762。












我研究了一下,原來所謂的"第一筆"代表每次空手(部位為零)後再持有部位時的第一筆進場價,以上圖為例,在2013/04/12 11:30,當下部位有6口,所以第一筆成本價為 EntryPrice(0) = 7825沒問題,至於上一次符合每次空手(部位為零)後再持有部位時的第一筆進場價在哪,就在編號3訊號出現時,所以在2013/04/12 11:30的 EntryPrice(1) 就是7762,如下圖。












所以相關關鍵字如:EntryDate,EntryTime,EntryPrice,EntryName,ExitDate,ExitTime,ExitPrice,ExitName,使用上的觀念都是如此。


這個問題的解決方式如下:

1.只下一口單不要加碼才會正確
2.自己寫程式控制
3.使用PosTradeEntryPrice(PosAgo,TradeNumber) 取代 EntryPrice


大家可以參考國外MultiCharts網站,有個關鍵字叫:

PosTradeEntryPrice(PosAgo,TradeNumber)

PosAgo:0是未平倉,1是上一次平倉,以此類推
TradeNumber:交易次數,就是這次交易的第幾次交易

舉例來說,PosTradeEntryPrice(0,0)就是目前部位的第一口進場價,PosTradeEntryPrice(0,1)就是目前部位的第二口單進場價,以此類推,以下圖為例:













程式碼:


print("date = " , date, " time = ", time, " PosTradeEntryName(0,0)= ", PosTradeEntryName(0,0), " (0,1)= ", PosTradeEntryName(0,1), " (0,2)= ", PosTradeEntryName(0,2), " (0,3)= ", PosTradeEntryName(0,3), " (0,4)= ", PosTradeEntryName(0,4), " (0,5)= ", PosTradeEntryName(0,5) );

print("date = " , date, " time = ", time, " PosTradeEntryPrice(0,0)= ", PosTradeEntryPrice(0,0), " (0,1) = ", PosTradeEntryPrice(0,1), " (0,2) = ", PosTradeEntryPrice(0,2), " (0,3) = ", PosTradeEntryPrice(0,3), " (0,4) = ", PosTradeEntryPrice(0,4), " (0,5) = ", PosTradeEntryPrice(0,5) );



輸出值:


date = 1130412.00 time = 1130.00 PosTradeEntryName(0,0)= SampleX_1 (0,1)= SampleX_2 (0,2)= SampleX_3 (0,3)= SampleX_1 (0,4)= SampleX_2 (0,5)= SampleX_3
date = 1130412.00 time = 1130.00 PosTradeEntryPrice(0,0)= 7825.00 (0,1) = 7821.00 (0,2) = 7816.00 (0,3) = 7824.00 (0,4) = 7814.00 (0,5) = 7802.00





  • EntriesToday永遠是第一筆

這個Function的功用是取得當天的交易次數,但經過測試後顯然跟我們所認知的不太一樣,直接去看程式碼會發現兩個問題:

1.程式是用EntryDate(n)計算交易次數:只要加碼交易次數就會算錯 (如上所述)
2.迴圈只跑10次:1天的交易次數最多計到10次


這個問題的解決方式如下:

1.只下一口單不要加碼交易次數才會正確
2.自己寫程式控制交易次數



此版本為MultiChart 7.4.20.400。

P.S:本資料僅供參考,使用者依本資料交易發生交易損失需自行負責,本人對資料內容錯誤或更新延誤不負任何責任。

2013年4月7日 星期日

MultiCharts程式篇:指定平倉

 

MultiCharts程式篇:指定平倉

 

 

1-先進先出 V.S 指定沖銷




  • MultiCharts的世界可以指定沖銷


現實生活中的期貨交易都是先進先出,但有些人可能因為策略需要作到指定沖銷,透過帳務才能清楚了解策略的損益狀況,就可以透過MC的指定沖銷達成。


舉例如下:

部份程式碼:


Buy ( "SampleX_1" ) 1 contract next bar at market;
Buy ( "SampleX_2" ) 1 contract next bar at market;
Buy ( "SampleX_3" ) 1 contract next bar at market;


Sell("Exit2") from entry("SampleX_2") next bar at market;
Sell("ExitAll") next bar at market;

正常來說進場順序為SampleX_1 -> SampleX_2  -> SampleX_3,出場順序也是如此,但若加上指定沖銷的語法 from entry("進場名稱"),則在MultiCharts圖中就會出現不一樣的出場順序,此範例先平倉SampleX_2,再依先進先出平掉SampleX_1和SampleX_3。












































此版本為MultiChart 7.4.20.400。

P.S:本資料僅供參考,使用者依本資料交易發生交易損失需自行負責,本人對資料內容錯誤或更新延誤不負任何責任。