2013年3月6日 星期三

ADE( AllDataEverywhere)

大概程式交易弄到後來,多多少少都開始會有跨圖表資料存取的需求,之前在凱衛的官方討論區有位熱心網友釋出了可以輸出也能讀入 Dll,可以用來讓A圖表輸出文字檔,B圖表讀入文字檔達到跨圖表存取資料的目的,我是用過確認OK,不過這樣的方式恐怕是不能支援在"回測"上的。

為了想實現自己的一些想法上的測試,還是回到這個老牌功能:ADE。安裝方法可以參考 D.K. 大的文章。我也做一下簡單的描述,下載這個壓縮檔(連結)後,解壓縮開後你會看到三個目錄夾,直接把"ADE"的這個目錄夾複製到 C:\ 去,另外兩個 "ELCollections" 開頭的目錄夾則要看你所使用的 MultiCharts 是屬於哪個版本,選一個把其中的 ELCollections.dll 複製到你的 MultiCharts 安裝目錄夾去,通常是 "C:\Program Files\TS Support\MultiCharts64"(如果你跟我一樣用x64版的話),走到這裡就安裝了...一半^^



接下來我們需要打開 MulriCharts 的 PowerLanguage Editor 把剛剛下載回來放在 "ADE" 及 "ELCollections" 內的兩個 ELD 檔案都匯入並且編譯好就安裝完成了。


至於 ADE 裡面有多少功能你可以在下載回來的 "ADE" 有個 All Data Everywhere 的 word 檔內好好研讀一下,可以做的事情不少。以下我簡單用個範例介紹這個 ADE 可以做的...其中一樣。

假設我有兩個策略要執行,但是也許我有資金管理上的需要可能會想要對這兩個策略所產生的交易訊號的部位大小做集中管理,我可以這樣做,新增兩個"指標"分別是 _ADE.markwtpositionOutput(當然你要自己取名我不反對的^^)內容如下:
var:Class("theMarketposition"),InfoMap(MapSN.new),WriteOK(true);

if currentbar=1 then
  value1=ADE.OpenMap(Class, GetSymbolName, ADE.BarInterval);
  
value1= MapSN.Put(InfoMap,"theMP", i_marketposition*i_currentshares);
value1= ADE.PutBarInfo(Class, GetSymbolName, ADE.BarInterval, ADE.BarID, InfoMap);

if LastBarOnChart and barstatus(1)=2 and WriteOK then begin
  value1= ADE.SaveMap(Class, GetSymbolName, ADE.BarInterval);
  WriteOK=false;
end;


我介紹一下以上這些程式碼內重要的部份,方便你自行修改,Class("theMarketposition") 是要輸出去的一個資料標籤(藍色),後續要讀取這個資料的圖表也得用一樣的標籤。還有一個標籤是"theMP"(綠色的部份),等等要用來讀取資料用的指標也要保持一致。還有就是要輸出去的東西,在這個範例裡要把部位大小與方向(桃紅色)丟出去。兩個標籤你都可以自己更換名稱,只要確定等等要用來讀取的指標內用的是一樣的名稱即可。

再來,我們已經做好了輸出用的指標後,要再做一個讀取用的指標:
var:Class("theMarketposition"),InfoMap(MapSN.new),sumMP(0);

if currentbar=1 then value1=ADE.OpenMap(Class, GetSymbolName, 17);
value1= ADE.GetBarInfo(Class, GetSymbolName, 17, ADE.BarID, InfoMap);
Value11=MapSN.Get(InfoMap, "theMP");

if currentbar=1 then value1=ADE.OpenMap(Class, GetSymbolName, 51);
value1= ADE.GetBarInfo(Class, GetSymbolName, 51, ADE.BarID, InfoMap);
Value12=MapSN.Get(InfoMap, "theMP");


sumMP= Value11+Value12;

plot1(sumMP,"sumMP");



這裡我打算在 A圖表中讀取的 B圖表 與 C圖表內的部位資訊,把 B圖表 與 C圖表的部位加總起來顯示在 A圖表上。你可以看到兩塊看起來像是重複的程式碼,實際上兩塊也只以很小的差異而已,讀取一個圖需要一塊,因為我要讀取兩個圖表的資訊,所以寫了兩塊,你可以看到這裡用到兩個標籤都採用跟輸出用指標內的一樣 Class─theMarketposition 與 InfoMap─theMP,這就輸出與輸入要標籤一致,這就是像是對身分證與健保卡認人一樣 XD,

因為我要讀取的兩個圖表是不同時間層級的,我得告訴它從哪個圖表來的,放到哪個變數去儲存。所以要在程式碼內告訴它,17分鐘的 及 51分鐘的,並且把 17分鐘來的放在 Value11,51分鐘來的放在 Value12,最後把 Value11 跟 Value12 加起來...畫出來。得到如下效果(要先把)輸出用的指標放入下圖中的第二與第三,讀取的指標放在第一個:

ps. 如果你要輸出的圖表會是一樣的時間週期,就不能用同一個輸出指標,要另外做不同的標籤去區分。