




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
版本號: MagicQuant簡 概 面 方 策 品 時 行 回 賬 委 成 持 交 交 采 數(shù) 指 復 概 調(diào) VWAP拆 基差Alpha對 Beta增強型對 DLL 數(shù)據(jù) 概易的全生命周期。MQ的功能覆蓋量化投機、算法交易、高頻交易、策略研究、、對沖以及趨勢交易等。MQ本文檔首先介紹MQ的使用操作,然后講述C#策略語言的基本語法,接著介紹策略相能,最后通過一些實際的例子介紹MQ的功能擴展和策略范例。特色功MQ始終將確保策略安全放在最高優(yōu)先的位置,通過核級加密、不可逆文件以及用戶平臺架下圖是MQ的網(wǎng)絡拓撲圖。MQ集成了國內(nèi)主流券商、經(jīng)紀商柜臺系統(tǒng)的接口,可以輕松無縫地在國內(nèi)的各大券商、經(jīng)紀商直接進行交易。MQ內(nèi)嵌了和實時行情通接口,在實盤交調(diào)用交易的方法系統(tǒng)將拋出異常券商機行行情數(shù)據(jù)交易指令柜臺系交易網(wǎng)銀江全CTP柜臺系MQ客戶CTP行情服務交易 安 MQ3.NETFrameworkMQ運行的基礎(微軟提供MQ實時行情源客戶端(可選登錄MQ主頁:http://w /然后進入【使用】欄目,在置頂?shù)奶又蝎@取安裝包的。安裝包后進行安裝。只面向MQ用戶開放,如果需要賬號請聯(lián)系MQ管理員:.NET由于MagicQuant是基于Windows平臺和.NETFramework3.5開發(fā)的,因此無法在LinuxUnixWindows平臺下使用。.NETFramework3.5的微 銀江行情是一種的全推實時行情源(可選其地址為: /data/2011/0411/article2407.htmVisual軟的開發(fā)工具VisualStudio2010。 MQ自身需要開放網(wǎng)絡端口8080和8443登運行Ats.Core.exe程序,點擊右下角的按鈕,可以MQ賬號。以后就可以使用該賬號登陸MQ。的用戶名就是MQ賬號,請牢記MQ用戶名和。一個MQ賬號下可以管理關聯(lián)多個實盤、賬號,可以方便實現(xiàn)多賬號管理。普通登錄需要輸入用戶名和,服務器驗證成功登錄后就進入MQ的主界面了。登錄界面布歷史數(shù)Tick、分鐘線和日線。MQ安裝時自帶的數(shù)據(jù),提供了部分重要品種(股指、上證指數(shù)、成指、滬深300、深發(fā)展和浦發(fā)銀行等)部分時段的歷史數(shù)據(jù)。這些數(shù)MQ安裝程序根下的data。通過系統(tǒng)配置可以重新設置數(shù)據(jù)。TickTick時請注意對應好文件夾的層次關系。數(shù)據(jù)中心: 迷你數(shù)據(jù)包提供的內(nèi)容包括股指Tick數(shù)據(jù)、的Tick、分鐘線、日線數(shù)據(jù)。指的是上證指數(shù)、成指、滬深300指數(shù)、浦發(fā)銀行以及深發(fā)展5個品種。請聯(lián)系MQ管理員。數(shù)據(jù)管理功能可以直接瀏覽和的歷史數(shù)據(jù)。擇要查看的品種和日期,下面就可以顯示歷史Tick數(shù)據(jù)??梢圆榭雌贩N、除權除息表、Tick、日線以及分鐘線和日期,下面就可以顯示客戶端本地保存的Tick數(shù)據(jù)。實時行戶端,MQ本身不提供轉發(fā)實時行情的服務,只提供從客戶端接收其它行情源的功能。?行時,MQ就會從公司接收實時行情數(shù)據(jù)。行情的服務和質(zhì)量由公司保證。,在公司的行情因此在啟動多個賬號的策略時優(yōu)先啟動行情速度最快的公司對,MQ會從上期模擬平臺接收行情數(shù)據(jù),?行銀江網(wǎng)絡 期之前需要聯(lián)系MQ對銀江網(wǎng)絡進行續(xù)費處理。000001.SH賬戶管用戶需要擁有一個MQ賬戶才能登錄MQ系統(tǒng)進行實盤交易,而一個MQ賬戶可以關聯(lián)都是與當前登錄的MQ賬戶關聯(lián)的。出于安全考慮,MQ賬戶的是保存在MQ服務器端的,而實盤賬戶的是保存在客戶端本地計算機硬盤里的。MQ賬戶信息顯示當前MQ的余額和過期日期。MQ余額用于對實盤自動交易進行。過期日期目前主要用于提醒銀江行情是否到期。確的經(jīng)紀商。CTP柜臺系統(tǒng)提供了模擬賬號,請向的公司申請CTP模擬賬號、、公司代碼。上期模擬有2個代碼,一個是2030由上期技術,一個是4030由公司自己。策略管以后會生成相應的策略dll文件。的。需要注意一個策略dll中的策略的類名不能相同。注意:Ats.Core.dll和Ats.Indicators.dll是必須的動態(tài)庫這兩個文件在 略dll文件加密后導入到MQ中。注意:因為出于策略安全考慮,MQ每次啟動程序時都需要強制輸入該。該既不入的策略就不能被使用,所以請記牢您第一次載入策略時輸入的策略。用戶登錄MQ以后,都需要輸入策略,點擊【策略】后,顯示成功后才能注意:和實盤交易賬號的一樣,MQ的策略源碼和dll文件均只在客戶端計算機本地運行。由于MQ采取的多重加密,盡最大努力保護用戶的策略安全。工程管 r模式,是基于實時行情進【盤】則是一旦發(fā)現(xiàn)委托滿足成交條件,則按照較為嚴苛的盤口成交,例如在盤賬戶面手工交實盤程開啟實盤程序化交易之前也需要連 柜臺服務器,開啟以后其圖標會變成如果您需要開通實盤交易,請聯(lián)系MQ管理員,提供您的公司、交易賬號以MQ賬號,MQMQ管理員功能。例如操作數(shù)據(jù)庫、網(wǎng)頁、實現(xiàn)復雜回溯計算等。基于MQ的策略語言,金融工程2.12.1象C#語言處理的都是對象(Object。、賬戶、Tick、Tick、K線、指標對象具有屬性和方法。屬性對象的特征。例如賬戶的賬號、余額、保證金等VisualStudio中,對象的屬性和方法可以通過鍵入點.來調(diào)出。基本語顯示ok和finish。if(a=={}注意:在一個代碼區(qū)塊定義的變量只在這個代碼塊內(nèi)有效以在句首使用“//”將該行文字注釋,若是需要對多行語句進行注釋,則可使用“/*...*/”strategy變量的效率最高。下面介紹C#語言中最常用的變量類型:True201211日stringa="MagicQuant";doubleb=0.618;intc=5;boold=true;DateTimet=newDateTime(2012,1,1,9,30,0);//定義時間t為+加-減*乘/除%intmyInt=0;//變量myIntmyInt=5+(3*4);//執(zhí)行計算關系計算的結果是一個布爾變量(TrueFalse。=<>inta=4; intb=5;if(a>b){}{}
邏輯與(&&)和邏輯或(||)對兩個布爾值或者表達式進行邏輯計邏輯與TrueTrueAB果是Fa=1;intb=2;intc=0;if(a<b&&b<c){Print("a<band}邏輯或當兩個布爾值中,只要有一個為True時,邏輯或(||)計算結果就為TrueAB的布爾表達式,以節(jié)省計算資源。如下面的代碼:程序首先計算a<b,得出True,此時直接返回結果True,并不需要計算表達式b<a=1;intb=2;intc=3;if(a<b||b<c){Print("a<bor}在一個變量的屬性前,一般先要確保變量本身有效,然后再看調(diào)用的屬性是否有效。下面斷其長度大于0,最后還要檢查價格是否合理,防止數(shù)據(jù)壞點導致后續(xù)計算發(fā)生錯誤。if(AllFutures!=null&&AllFutures.Count>0&&{doubleCurrentPrice=}最終結果為True?;镜馁x值運算符是=,同 C#還支持+=,-=,*=,/=這種簡潔的賦值運算符=xyyxyxx-xyxxX*=yxx*xyxxx++xx-x--xxintstringinta=stringb=stringintstringa="100";intb=int.Parse(a);doubleint后再轉換成字符串,最后利用Parse的方法解析成intdoublea=intb=int.Parse(Math.Round(a,0).ToString()字符串可以通過+stringM="Magic";stringQ="Quant";stringMQ=M+Q;字符串也可以用+=運算符stringstr="Magic";str+="Quant";數(shù)學函對數(shù)、絕對值、三角函數(shù)等。C#將這些基礎的數(shù)學函數(shù)封裝在一個叫做Math的類庫中。C#VisualStudio的智能技巧也可以運用在其它類庫上。在VisualStuido中,首先鍵入類名Math,然后鍵入點.,C#提供了2個常數(shù):圓周率PI和自然對數(shù)edoublepi=Math.PI;doublee=Math.E;Print("e="+e.ToString());Math.Abs(-|-Math.Pow(2,Math.Max(100,Math.Min(100,9下面的實例代碼中實現(xiàn)了經(jīng)典的指數(shù)函數(shù)擬合公式????=??0+??1???1Futurefuture=AllFutures[0];doubley=y0+A1*Math.Exp(-x/條件結C#語言支持對程序進行流程控制,包括條件結構和循環(huán)結 intx=0;if(x=={}if-If-else結構,當特定的條件滿足時執(zhí)行if后面的語句,否則執(zhí)行elseintx=1;if(x=={}{}
intx=2;if(x=={}elseif(x=={}{}
intx=2;switch{casecasecase}當沒有任何數(shù)據(jù)與其匹配時,則轉入default循環(huán)邏for初始化;條件表達式;迭代計算{執(zhí)行代碼}例如想將策略訂閱的所有品種代碼顯示出來,就可以用for結構。由于C#列表0i=0i<AllFutures.Count用于判斷是否索引移到了最后一個;迭代計算是在每次循環(huán)結束后執(zhí)行,對索引i加1。執(zhí)行代碼中將品種通過索引i取出,然后將品種代碼顯示在屏幕上。for(inti=0;i<AllFutures.Count;{Futurefuture=AllFutures[i];Print(future.ID);}上一個例子中的AllFutures是一個列表,是多個品種的合集。如果要遍歷數(shù)組、列從下面的代碼中可以看出,實現(xiàn)同樣的功能,foreach比for要簡潔很多。foreach(Futurefuturein{}while條件表達{}10List<double>型的浮點型數(shù)據(jù)隊列,然后每來一個Tick,就把的價格添加到隊列中。如果隊列的長度超過了usingSystem;usingSystem.Collections.Generic;//由于用到了List,需要這個命名空namespace{publicclassTestStrategy:{publicoverridevoidInit(){PriceBuffernewList<double>();//}publicoverridevoid{Futurefuture=if(futurenull&&future.LastPrice0)//{PriceBuffer.Add(future.LastPrice);//將的價格添加到Listwhile(PriceBuffer.Count>10)//如果隊列長度{PriceBuffer.RemoveAt(0);//移除最先加入}}}}}不能退出的情況,這種情況稱之為死循環(huán),例如:while{}while{if(}以使用continue語句來達到目的,如下:while條件表達式A{if條件表達式B}當條件表達式A滿足時,循環(huán)被執(zhí)行,在執(zhí)行完執(zhí)行語句X后,將判斷條件表達式B的BTruecontinueYA的值,進入下一次循環(huán)。否則將繼續(xù)執(zhí)行執(zhí)行語句Y。開開條件表達式執(zhí)行語句結條件表達式執(zhí)行語句高級類下面列出MQ中常用的一些枚舉類型:publicenu{買入賣出}publicenu{開倉}publicenu{多頭}K線類publicenu{秒分鐘小時日線周線月線}publicenu{//////////////////}在策略中也可以自定義枚舉類型。假設定義策略可以處于三種狀態(tài):無、做空、publicenum{}前面學過Datetime類型有時想知道兩個時刻間的信息需要用到TimeSpan類型。兩個DateTime類型的值相減,可以得到時間段TimeSpan。進一步TimeSpan的Total*類屬性,可以獲取這個時間段的總長度。下面這個例子中計算出已經(jīng)開盤了多少分鐘。DateTimetOpennewDateTime(Year,Month,Day9,30,0);TimeSpants=Now-tOpen;//獲取開盤到現(xiàn)在的時間差算當前距離上次交易時刻T0的時間段的總長度,如果時間段過短,則不進行新的交易。doubleDT=100;if((Now-T0).TotalSeconds>={//...T0Now;//}用usingSystem.Collections.Generic。List的操作主要包括::[i],i繼續(xù)沿用前面一個例子,策略需要最近10個Tick的算術平均價格,可以構建一個自己的Tick緩存,將到來的Tick添加到緩存中,當緩存中Tick的個數(shù)超過10時,將Buffer中第一個Tick移除。然后對Buffer進行算術平均計算。usingusingAts.Core;namespace{publicclassTestStrategy:{[Parameter(DisplayNDescriptionCategory參數(shù)")]intN=10;List<FutureTick>Buffer=newList<FutureTick>();//自己一個Tick緩publicoverridevoid{FutureTicktick=LastFutureTick();//獲取的Tickif(tick!=null){Buffer.Add(tick);//添加的Tick到Bufferwhile(Buffer.Count>{Buffer.RemoveAt(0);//移除第1個}}if(Buffer.Count>={doubleavgPrice0;doublesumPricefor(inti=0;i<Buffer.Count;{sumPrice+=}avgPrice=sumPrice/Buffer.Count;}}}}字典是鍵Key和值Value的對應關系的集合,寫法是Dictionary<key,value>,key和value均可以是任意類型。在策略中如果要使用字典Dictionary,需要添加usingSystem.Collections.Generic。字典Dictionary的操作主要包括::[key],key中可以建立一個鍵是string型,值是double型的字典,用來保存代碼和止損閾值的對usingSystem;usingAts.Core;namespace{publicclass字典Dictionary范例{Dictionary<string,double>DICT=newDictionary<string,double>();//定義publicoverridevoid{DICT=newDictionary<string,double>();DICT.Add("000001.SZ",-0.2);//添加及其止損閾值DICT.Add("600001.SH",-0.5);DICT.Add("000735.SZ",-}publicoverridevoid{foreach(Stockstockin{stringStockCode=stock.StockCode;if(DICT.ContainsKey(StockCode)){doubleGate=DICT[StockCode];//通過鍵對應的{StockPositionpos=MyStockPositions[StockCode];if(pos!=null&&pos.EnableVolumn>0){SellStock(StockCode,pos.EnableVolumn,}}}}}}}方字符串型,輸入?yún)?shù)是整型的方法,方法名是MyMethod。publicstringMyMethod(intstringMyMethod(int2stringMyMethod(intx,int如果方法沒有返回值,用void作為方法的返回類型voidMyMothod(int如果方法有返回值,在代碼塊的最后必須返回 doubleGetAvgValue(doublex,doubley,double{doubletmp=x+y+z;returntmp/3;}3概 策 回測復盤:基于歷史數(shù)據(jù)(Tick和K線),驅動策略運行,產(chǎn)生信號,依據(jù)虛執(zhí)行Pr交易(仿真交易使用實時行情源驅動策略運行,同時在虛擬賬戶里記紀商的柜臺系統(tǒng),用真實進行交易。5~6秒推送一個Tick。因此對于程序化交易而言,實盤和復盤中的Tick數(shù)據(jù)都是必不可少的。這一點在投機策略中顯得尤為重要。大部分策略都是基于Tick運算執(zhí)行的。Tick行情 Tick行情價Tick【StockTick】中包含了行情推送的實時信息,如價格、盤口等。稱為Bar。高 結 Bar和Bar的數(shù)據(jù)結構是一樣的,在MQ中都被是Bar。Bar既包含了時間維開高低收空間維度上變化構成的數(shù)據(jù)單元。如下圖所示,多個數(shù)據(jù)單元Bar就構成了一個時間序列事件驅MQMQ策略可以并行執(zhí)行算法,及時響應各種事件的發(fā)生。所謂事件驅動就是你點什么按鈕(即產(chǎn)生什么事件),計算機就執(zhí)行什么操作(即調(diào)用什么函數(shù))。在MQ策略中用戶點擊開始,計算機就執(zhí)行Init,一個TickBar驅動數(shù)MQ中數(shù)據(jù)到來的事件驅動策略運行(Run)Tick驅動,也可以是K線驅動。如果是單純策略,一般采用上證指數(shù)【000001.SH】、深證成指【399001.SZ】等交易所指數(shù)作為驅動品種。如果采用個股作為驅動品種,當遇到個股停牌時,策略就會由于沒有Tick數(shù)據(jù)而無法正確執(zhí)行。如果是的混合策略,一般采用Tick周期短的品種,即情更新速度太慢而錯過的交易機會。Tick當選擇Tick驅動方式時,每當新來一個TickTickTick序tt代碼結§空策略模板※源代碼\策略范例\空策略模板usingAts.Core;namespace{publicclass{[Parameter(Display="下單量",Description="每次下單數(shù)",Category="參數(shù)")]intQty=1;doublek=publicoverridevoid{}publicoverridevoid{}publicoverridevoid{}voidMyTask(){}publicoverridevoidOnOrder(FutureOrder{}publicoverridevoidOnTrade(FutureTrade{}}}Ats.Core以及Ats.Indicators。usingAts.Core;下表列出了一般常用的類庫方法MQMQ處理List、DictionaryXML下面的例子中,參數(shù)的變量名是Qty,初始值是1,界面顯示的名稱是“下單量”,描述是publicoverridevoid{Qty2;//}不同于參數(shù),策略的變量是不可以由用戶在MQ界面里配置初始值的,因此變量在策略usingSystem;namespace{publicclassTestStrategy:{intclc=publicoverridevoid{stringstr="["+clc.ToString()+"]Tick,t="+Now.ToString();}}}當用戶啟動策略時,初始化事件被觸發(fā),策略執(zhí)行InitInit一般執(zhí)行K線,設定變量的初始值,顯示KbackDays需要從一個外部文件。文本到的是一個字符串型的變量readStr,通過int.Parse的方法解析成整型變量backDays。最后backDays作為GetStockBarSeries的參數(shù),構造了上證指數(shù)的日K線。注意:K線的構造工作一定要放在Init里面完成,而不能放在RunusingSystem;usingSystem.IO;//文件讀寫namespace{publicclassTestStrategy:{publicoverridevoidInit(){=stringreadStr=File.ReadAllText(FilePath);//將文件中的內(nèi)容到內(nèi)存intbackDaysint.Parse(readStr);////構造上證指數(shù)的日K線,回溯backDayskLineGetStockBarSeries("000001.SH1,EnumBarType.日線不復權,}}}當驅動數(shù)據(jù)到來事件發(fā)生時,策略就會執(zhí)行Run里面的代碼。一般來說,策略的算法都是寫在Run中的。對于Tick驅動的策略,每到來一個驅動品種的Tick,Run就會被執(zhí)KBar結束時,Run就會被執(zhí)行一次計算。publicoverridevoid{}算法執(zhí)行時間長于兩個Tick間的時間間隔(例如的Tick間隔為500毫秒程序會執(zhí)行當前完成至當前代碼的最后一行,然后在的TICK到來后執(zhí)行下一次的算法計算。因此兩次運算中間可能會有部分Tick沒有參與計算。Tick[0]、Tick[1]、Tick[5]Tick[1]時,由于某種原因(如Tick序 05205213計算耗時過t 下面這個例子中,策略將的價格保存到文件 publicoverridebool{doubleprice=AllFutures[0].LastPrice;//獲取價stringFilePath="c:\\price.txt";//文件路徑File.AppendAllText(FilePath,price.ToString());//將價格寫入文件returntrue;}時任務。定時任務前面需要加任務標志[Task(Time="15:14")],設置定時任務的執(zhí)行時刻。N跳。IF1206IF1206IF1205IF1206和IF1205的價分別是2500和2502。那么調(diào)用ClearPositions(10)就會以IF1206的價2500-10*0.2=2498的價格平掉IF1206的全部持倉,而但是由于沒有訂閱IF1206的平倉單,并且沒有成IF1206IF1206的平倉委托就是廢單。此時需要先撤法CancelAllFutureOrders(),把當前所有訂閱品種的委托先撤單?!焓毡P定時清倉※源代碼\策略范例\收盤定時清倉usingSystem;usingAts.Indicators;{publicclass{voidMyTask(){}}} FutureOrderpublicoverridevoidOnOrder(FutureOrder{Print("委托回報}委托FutureOrder委托手數(shù)=未成交手數(shù)+成交(CFFEX(SHFE商品交易所(DCE、鄭州商品交易所(CZCE。 FutureTradepublicoverridevoidOnTrade(FutureTrade{Print("成交回報}成交FutureTrade下面的例子演示了如何根據(jù)成交 的OrderSysID找到對應的委FutureOrder§成交匹配委托usingSystem;usingAts.Core;namespace{publicclass{publicoverridevoidOnTrade(FutureTrade{stringTradeID=stringOrderSysID=trade.OrderSysID;FutureOrderSeriesOrderLst=GetFutureOrders();foreach(FutureOrderorderinOrderLst){if(order.OrderSysID=={Print("成交TradeID對應委托}}}}}在有了基本的C#語言知識和了解的概念之后,就可以開始編寫自己的策略了。作。在MQ中,策略獲取的信息包括:品種信息、實時行情、回溯歷史數(shù)據(jù);執(zhí)行的操作包括:執(zhí)行交易和交互。MQAts.CoreStrategy基類。只要熟悉了Strategy基類提供的各種屬性和方法,就能靈活自如的開發(fā)策略。品MQ的工程配置面板中可以配置策略訂閱的品種。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 四年級信息技術上冊第7課制作個人小名片教案1粵教版
- 可回收材料應用研究-全面剖析
- 2025屆高考地理一輪復習全球氣候變化對人類活動的影響鞏固練習新人教版
- 2025版高中物理第四章4法拉第電磁感應定律訓練含解析新人教版選修3-2
- 概念框架與語言教學-全面剖析
- 一年級數(shù)學下冊比較數(shù)的大小教案蘇教版
- 物聯(lián)網(wǎng)設備健康評估體系-全面剖析
- 甲型肝炎宿主免疫反應研究-全面剖析
- 智能穿戴設備應用-第2篇-全面剖析
- 兒童健康促進策略-全面剖析
- 2024-2025學年下學期高一語文期中必刷??碱}之作文
- 2025北京豐臺高三一?;瘜W試題及答案
- 安徽省示范高中皖北協(xié)作區(qū)2025屆高三3月聯(lián)考試卷語文試題(含答案)
- 兒童福利政策課件解讀
- 公司關聯(lián)擔保效力裁判規(guī)則完善研究
- 茶臺買賣合同5篇
- 2025年臨床醫(yī)師定期考核必考復習題庫及答案(900題)
- 高中生物競賽 第九章 染色體畸變課件
- 四年級下冊《小數(shù)的意義和性質(zhì)》整理和復習
- 土壤污染修復技術對比分析
- 3萬高爐轉爐混合煤氣柜技術規(guī)程
評論
0/150
提交評論