在寫這一篇之前,我想著我應該是直接修改上一篇介紹「MultiCharts輸出即時部位文字檔」比較好,還是重新寫一篇?幾經考慮,我想我還是重新寫這篇後來我是如何實作在我電腦上的應用好了,因為我覺得這可以作為一個對照的比較。
先讓我解說一下前篇。MC輸出即時部位文字檔的用法最早的來由是從凱衛(引進 MultiCharts中文版,自己也賣下單機)公司的分享,從而提供了把MultiCharts的即時部位狀態往外輸出的可能,但因為凱衛提供的方式,常常造成 MultiCharts 與接手實際下單的下單機爭奪部位文字檔的讀取權而造成文字檔被鎖住而失效,因而凌波微步大加以改善,改用呼叫 DLL 的方式而不用 file delete、file append 的方式去做輸出文字檔的這工作,可以解決兩個程式間互搶文字檔讀取權的問題。
我自己照樣畫葫蘆套用之後,卻發現了另外一個問題,就是當 IntraOrderGeneration=True 的時候,竟然造成了訊號本身的錯誤,出現了在策略邏輯外的訊號。這是 在 MultiCharts 上同一個策略,但是 IntraOrderGeneration= True/False 的差異:
在HTS上Run這策略的訊號一如 IntraOrderGeneration=False 的:

幾個不同策略的實驗,我發現當 IntraOrderGeneration=True 幾乎都會對我的策略訊號有所改變,而且全部都是交易次數暴增。據我所了解,IntraOrderGeneration=True 有點像是 HTS 中交易指令的 This Bar 狀態,即使策略的程式碼,都是 Next Bar 動作,也在條件判斷中排除兩兩成立的狀況了。經過詢問凌波微步大過去使用這麼長一段時間可有我這樣的狀況?得到的答案是「用指標去計算翻單的部位數值,輸出給下單機用,沒發生過我這情形」。
我想,如果大多數人自己寫好了交易訊號的程式,要去另外做改換成指標形式來輸出當下的部位數值,恐怕不那麼容易。畢竟,在訊號上開發程式,經過回測的驗證流程後,直接讓這個交易訊號就做下單執行,會是比較直覺式的作法。既然,開發交易訊號的時候預設就是 IntraOrderGeneration=False 那好,我不要動它,因為要讓部位狀態"即時"輸出,IntraOrderGeneration=True 是個必要,我另外做一個指標(因為要讓部位狀態"即時"輸出,IntraOrderGeneration=True),讓它去讀取這個交易訊號當下的部位狀態呢?也就是,訊號在 IntraOrderGeneration=False 下運作而產生,藉由一個"指標"來轉送輸出去文字檔,如此一來,應該就可以得到交易訊號是"正常"的囉?
於是...指標的程式碼(內容結構解說請看上篇):
[IntrabarOrderGeneration = True];
Vars:intrabarpersist Current(0);
DefineDLLFunc:"d:\deal\outputfile.dll",void,"outputfile",lpstr,lpstr;
//Output Position for AutoTrader
Current= i_MarketPosition * i_CurrentContracts;
if D=lastcalcdate and T=lastcalctime then begin
outputfile("R:\Position_DK.txt","0,"+NumToStr(D,0)+","+NumToStr(Q_Time,0)+","+NumToStr(Current,0)+",0,"+NumToStr(C,0)+",1");
end;
plot1(Current,"Position");
plot2(0,"0",darkgray);
講了半天,總是要看看效果的嘛!
簡單一句話,It works!藉由凱衛分享的方式可以讓部位訊號即時輸出(但直接在訊號裡面改可能造成訊號的錯誤),加上凌波微步大的DLL可以讓 MultiCharts 跟下單機不打架。只要把凱衛的方法轉個彎做在指標裡,跟策略放在同一張圖裡當做副指標,用上凌波微步大的DLL,今天的測試:很好!
結論:我的作法就是不去更動你交易訊號的程式碼,另外做一個指標(用上述的程式碼,因你個人需求修改紅色與藍色處),把這個要輸出部位文字檔的指標跟你的交易訊號放在同一張圖當做副指標,就可以得到 正確的即時策略部位文字檔 輸出了。
這個輸出部位到文字檔的功能能做成類似模組化給大家套用是最好的,希望有在使用 MultiCharts 的朋友如果有用這個方法而有狀況的話,可以來此留言回報,謝謝。
如果你有採購報價資訊源的需要,可以參考我的測試經驗。










