1. 程式人生 > 實用技巧 >量化投資_EasyLanguage/PowerLanguage教學課程__【第二篇專題】__【第十五章委託單發單機制(轉,重點)】

量化投資_EasyLanguage/PowerLanguage教學課程__【第二篇專題】__【第十五章委託單發單機制(轉,重點)】

第十五章:委託單發單機制

  委託單發達機制內容是最難的,也是最難測試的,主要牽扯到this bar與 next bar,market、limit單等、bar內交易與非bar內交易內容。

1.委託單條件判斷委託單觸發

  這裡首先我們需要理解兩個概念,一個是“委託單條件判斷”,另一個是“委託單觸發”,這兩個概念會貫穿這部分的內容,我們先來看一下程式碼例子,如下:

ifcondition1then
buynextbaratmarket;

  條件condition1是next bar委託語句的判斷條件,當條件condition1成立時,還需要等待下一筆tick的觸發,才能將買入市價單傳送出去;也就是說買入市價單是否能傳送到交易所,涉及兩個步驟,缺一不可:

  那就是首先訊號指令碼執行計算必須進行“委託單條件判斷”這個步驟,並且條件成立,然後需要“委託單觸發”這個步驟,才可以將next bar的委託單傳送到交易所;這裡只是通過一個簡單的例子來闡述這兩個概念,那麼對於“委託單條件判斷”和“委託單觸發”就光這兩個步驟在非bar內模式、bar內模式、bar外模式、訊號指令碼不同的計算驅動因素會表現的不一樣

【備註】:“委託單條件判斷”和“委託單觸發”,就是在前面的“理想的limit限價單發單模式”中的“條件不變”,“條件不變” = “委託單條件判斷”(不變) and “委託單觸發”(不變)= “不會撤單,不會撤單再重新發單”

  This bar和next bar主要有兩點區別:

  一個區別就是,this和next的區別,這正如它們的名稱一樣,next bar委託單需要經過兩個步驟才能傳送到交易所,也就是上面說到的兩個步驟,而this bar委託單隻需要一個步驟也可以說“委託單條件判斷”和“委託單觸發”兩個步驟對於this bar委託單來說是一個步驟,“委託單條件判斷”的同時,若條件成立就“委託單觸發”立即傳送到交易所;

  另一個區別是,next bar有bar內模式、bar外模式,也就是說,next bar委託單可以基於bar的開盤狀態、bar內狀態、收盤狀態、bar外狀態進行“委託單條件判斷”,基於bar的開盤狀態、bar內狀態、收盤狀態、bar外狀態進行“委託單觸發”

,而this bar只能基於收盤狀態進行“委託單條件判斷”和“委託單觸發”。所以,在總體上this bar的使用是受限制的,不如next bar的使用功能豐富,但是從速度上說,this bar更快;若您對this bar和next bar的區別沒有掌握或者說您沒有完全掌握這篇帖子,那麼建議您不要使用this bar委託語句。在本文的後面不再對this bar進行闡述,請參考next bar的闡述進行理解this bar的功能。

2.自動交易進行中

  這裡要區分一個兩個標題,“自動交易進行中”和“開啟自動交易的瞬間”,這是因為next bar委託單需要兩個步驟,當這兩個步驟都發生在自動交易進行中的時候,就是“自動交易進行中”所要闡述的內容;當“委託單條件判斷”這個步驟在開啟自動交易之前,而“委託單觸發”這個步驟發生在開啟自動交易之後,就是“開啟自動交易的瞬間”這個標題所要闡述的內容了。之所以這樣分開,有兩個考慮,一個是這兩種情況下,next bar委託單表現的不一樣,另一個是實盤有些技巧也是需要這部分內容的。

  2.1未開啟bar內模式

  未開啟bar內模式,也就是非bar內模式;

  非bar內模式與bar內模式的一個區別,就是非bar內模式下“委託單條件判斷”這個步驟只能基於開盤狀態或者收盤狀態進行執行而bar內模式下“委託單條件判斷”這個步驟可以基於開盤狀態、收盤狀態、bar內狀態進行執行,這個區別也正如它們的名稱一樣,前者是“bar外”後者是“bar內”;

  當然非bar內模式和bar內模式下,“委託單觸發”這個步驟都可以基於開盤狀態、收盤狀態、bar內狀態進行執行,而不能基於bar外狀態進行執行

  Bar外模式下,這兩個步驟都可以基於bar的開盤狀態、bar內狀態、bar的收盤狀態、bar外狀態進行執行,是否基於bar外狀態進行這兩個步驟的執行,是bar外模式與非bar內模式、bar內模式的區別。我們前面說過,bar有4個狀態,bar的開盤狀態、bar的收盤狀態、bar內狀態、bar外狀態,這裡為了下面的敘述嚴謹,我兩次強調一點,bar的開盤狀態是以接收到開盤tick為基準而且這只是一個瞬間,並不是一個持續的狀態bar的收盤狀態是以接收到收盤tick為基準,這也只是一個瞬間,並不是一個持續的狀態

  bar內狀態,是指在當根bar開盤之後並且在當根bar收盤之前,這個期間訊號指令碼執行的計算(對計算的驅動因素不限制)

  bar外狀態,是指在當根bar收盤之後並且在下一根bar開盤之前,這個期間訊號指令碼執行的計算(對計算的驅動因素不限制)

  而訊號指令碼執行的計算,上面我們已經敘述了所有的訊號指令碼的計算驅動因素了。

  在非bar內模式下,訊號指令碼基於收盤tick執行一次計算,這裡計算執行的是“委託單條件判斷”這個步驟,然後下一根bar的開盤tick執行“委託單觸發”這個步驟,也許您可能會說,收盤狀態之後並且在開盤狀態之前,這中間還有bar外狀態,那麼bar外狀態(也就是訊號指令碼在當根bar收盤之後,並且下一根bar開盤之前,這個期間訊號指令碼執行計算)是否可以執行“委託單觸發”這個步驟,答案是不行,也就是bar外狀態不會影響非bar內模式下委託單的兩個步驟在非bar內模式下,若訊號指令碼基於開盤tick執行計算(訊號指令碼中引用了下一根bar的資料,上文有說過),這時計算執行的是“委託單條件判斷”這個步驟,因為開盤狀態之後,只有兩種可能的狀態,即bar內狀態和收盤狀態,當然這兩種狀態都可以執行“委託單觸發”這個步驟的執行,下面舉例說明一下(這裡最大bar設定為0)。

//訊號程式碼
[ProcessMouseEvents=true]
value1=getappinfo(aicalcreason);
opennextbar;
ifcurrentbar=605then
buynextbaratmarket;
print("currentbar=",currentbar,",time=",time,",barstatus=",barstatus,",value1=",value1);
//部分輸出
currentbar= 600.00,time=1427.00,barstatus= 0.00,value1= 0.00
currentbar= 601.00,time=1437.00,barstatus= 0.00,value1= 0.00
currentbar= 602.00,time=1500.00,barstatus= 0.00,value1= 0.00
currentbar= 603.00,time=1501.00,barstatus= 0.00,value1= 0.00
currentbar= 604.00,time=1504.00,barstatus= 0.00,value1= 0.00

  最大bar設定為0,此時bar的絕對編號等於相對編號,圖表中最後一根bar的編號為605,而公式編譯器中輸出欄位中最後一根bar的編號是604,這裡需要簡單解釋一下,訊號指令碼基於開盤tick執行計算,是指當接收到下一根bar的開盤tick時,訊號指令碼會基於當根bar執行計算訊號指令碼中的關鍵字currentbar、close等返回的資訊都是當根bar的資訊,而不是下一根bar的資訊;在非bar內模式下,基於下一根bar開盤tick的計算,除了Open next bar、Date next bar、Time next bar、DateTime next bar、Time_s next bar返回的是下一根bar的資訊(這5個關鍵字的資訊可以通過下一根bar的第一筆tick直接可以獲取到),其它關鍵字(例如,currentbar、close等等)返回的都是當根bar的資訊。

  這是一個非常不活躍的商品品種,圖表上現在是15:05分,當編號為606的bar的開盤tick接收的時候(假設是在15:09:30時,當根bar的收盤時間為15:10分),訊號指令碼會執行一次,此時訊號指令碼中關鍵字currentbar返回的是605,那麼“委託單條件判斷”這個步驟被執行了;接下來,我們會採用幾種可能的措施,以此來闡述不同的效果:

l若在15:15分之前,沒有接收到tick資料,因為我們在訊號指令碼中使用了語句[ProcessMouseEvents=true],所以當我們在圖表上點選一下滑鼠時,訊號指令碼會執行一次計算,也就是在編號為606的bar收盤之前執行一次計算,於是bar內狀態執行了“委託單觸發”這個動作,委託單被觸發傳送到交易所。

l若在15:15分之前,沒有執行滑鼠點選動作,但是在15:09:50時接收到一筆tick,儘管訊號指令碼不會基於該筆bar內tick執行計算,但是仍然是bar內狀態,即bar內狀態執行了“委託單觸發”這個動作,委託單被觸發傳送到交易所。

l若在15:15分之前,沒有執行滑鼠點選動作,也沒有接收到交易所的tick,底層產生一筆收盤tick,儘管訊號指令碼也不會執行計算,但是bar的收盤狀態執行了“委託單觸發”這個動作,委託單被髮送到交易所了。

  2.2開啟bar內模式

  開啟bar內模式,也就是訊號程式碼中使用語句[IntrabarOrderGeneration=true],在bar內模式下,訊號指令碼的計算是每接收到一筆tick訊號指令碼都會執行一次計算(開盤tick、bar內tick、收盤tick),當然也可以使用上文中敘述的其它的計算驅動因素。對於委託單的兩個步驟,用一句話來概括就是:訊號指令碼基於bar的開盤狀態、收盤狀態、bar內狀態進行“委託單條件判斷”,緊接著基於開盤狀態、收盤狀態、bar內狀態進行“委託單觸發”這個步驟。這個部分我不準備對於這一句話概括進行舉例,因為很好理解,但是需要舉例說明一下一直困擾和模糊的一個說法:條件單,條件滿足就發單,條件不滿足就撤單,價格變化就重發。下面的例子為敘述簡單起見,除了tick行情驅動的訊號指令碼計算,不考慮其它計算的驅動因素

案例1:

//訊號程式碼
[intrabarordergeneration=true]
iftime>=1400andbarstatus=0then
buy("first")nextbaratclose-10limit;
iftime>=1400then
buy("second")nextbaratclose-20limit;

假設當前bar的收盤時間為13:58,然後開啟自動交易

l接著在14:00:00時接收到收盤時間為1400的bar的開盤tick(即barstatus=0),開盤tick的價格是3710(假設商品合約是螺紋,週期為1分鐘),訊號指令碼基於開盤tick執行計算,顯然條件“time>=1400andbarstatus=0”是成立的,並且條件“time>=1400”也是成立的,也就是這兩筆條件委託的“委託單條件判斷”被執行了,並且都成立,就等待下一筆tick的觸發

l接著在14:00:30時接收到第一筆bar內tick(即barstatus=1),tick的價格是3700;經過前面的“委託單條件判斷”這個步驟的執行,這筆bar內tick執行了“委託單觸發”這個步驟,於是兩個條件單都發送到交易所了;現在的問題是,兩筆傳送到交易所的價格分別是多少呢?

l條件單的價格是在“委託單條件判斷”這個步驟確定的,並不是在“委託單觸發”這個步驟確定的,所以“first”條件單的限價是3710-10,即3700;“second”條件單的限價是3710-20,即3690

l條件單的價格確定了,但是條件的問題又來了;因為14:00:30的這一筆tick的接收,導致訊號指令碼又執行一次計算,但是條件“time>=1400andbarstatus=0”不再成立,這樣“first”委託單也會發送到交易所嗎?答案是肯定的。但是訊號仍然基於該筆tick執行了一次“委託單條件判斷”這個步驟。

l接著在14:00:50時接收到第二筆bar內tick(即barstatus=1),tick的價格是3670,此時這筆tick執行了“委託單觸發”這個步驟,因為訊號指令碼基於上一筆tick(即14:00:30這筆tick)執行了“委託單條件判斷)這個步驟,但是條件不再成交,所以這筆tick(即14:00:50這筆tick)觸發了”first”條件單的撤單;另外,上一筆tick在執行“委託單條件判斷”的同時也判斷了條件單的價格的變化,所以這筆tick觸發了條件單重發,也就是將”second”的條件單從交易所撤單,然後傳送3700-10,即3680

l通過上面的慢步驟的分析,進行小結一下:“委託單條件判斷”這個步驟會判斷委託單條件是否滿足,以及確定條件單的價格,“委託單觸發”這個步驟直接觸發委託單;若條件滿足,則第二個步驟觸發之後,直接傳送到交易所;若當前已經發送了條件單,當條件不再滿足,則第二個步驟觸發之後,將條件單撤單;若當前已經發送了條件單,當第一個步驟中確定價格變化了,則第二個步驟觸發之後,將條件單撤單然後重發,重發的條件單的價格以第一個步驟中確定的價格為委託價格。

  2.3開啟bar外模式

  Bar外模式的開啟,訊號指令碼中需要使用[AllowSendOrdersAlways=true],但是同時需要在訊號指令碼中使用[IntrabarOrderGeneration=true],也就是說bar外模式需要在開啟bar內模式下才能開啟。那麼委託單的兩個步驟在bar外模式下又是如何進行的呢?用一句話來概括就是:訊號指令碼中委託可以基於bar外狀態進行“委託單條件判斷”這個步驟,然後通過bar的開盤狀態、收盤狀態、bar內狀態、bar外狀態進行“委託單觸發”這個步驟;

  訊號指令碼中委託單基於bar的收盤狀態進行“委託單條件判斷”,委託單直接觸發,也就是說在收盤狀態“委託單條件判斷”和“委託單觸發”這兩個步驟同時執行;

  訊號指令碼中委託單基於bar的開盤狀態、bar內狀態進行“委託單條件判斷”,然後通過bar內狀態、bar的收盤狀態進行“委託單觸發”,不是兩個步驟同時進行。

3.開啟自動交易的瞬間

  3.1未開啟bar內模式

  未開啟bar內模式,基於收盤tick進行訊號計算,假設圖表週期為1分鐘,前一根bar的收盤時間為13:30,當根bar的收盤時間為13:31(圖表上最後一根bar,最新的bar),而且還沒有走完(即barstatus=0或1),那麼此時開啟自動交易之後,條件單基於收盤時間為13:30的bar進行“委託單條件判斷”,然後直接觸發委託,也就是“委託單條件判斷”和“委託單觸發”這兩個步驟同時進行,也就是開啟自動交易之後條件單直接傳送到交易所(但是市價單不會基於歷史行情進行“委託單條件判斷”,也不會基於歷史行情進行“委託單觸發”這兩個步驟,市價單需要在開啟自動交易之後執行“委託單條件判斷”和“委託單觸發”這兩個步驟,請參考“自動交易進行中”這一節內容);

  若當根bar(收盤時間為13:31)已經收盤,並且下一根bar還沒有開盤,那些此時開啟自動交易,條件單基於收盤時間為13:31的bar執行“委託單條件判斷”,需要等到下一根bar第一筆tick(開盤tick)執行“委託單觸發”這個步驟(市價單也會基於13:31的收盤bar執行“委託單條件判斷”,需要等到下一根bar第一筆tick(開盤tick)執行“委託單觸發”這個步驟)。

未開啟bar內模式,基於下一根bar第一筆tick進行訊號計算,當前bar的收盤時間為14:00(圖表上最後一根bar,最新的bar),還沒有收盤(即barstatus=0或1時),那麼此時開啟自動交易,條件單直接基於14:00的bar的開盤tick(即barstatus=0)進行“委託單條件判斷”這個步驟,然後直接觸發委託,也就是“委託單條件判斷”和“委託單觸發”這兩個步驟同時進行,不需要等待最新的一筆tick的觸發委託(市價單需要在開啟自動交易之後進行“委託單條件判斷”和“委託單觸發”這個步驟,請參考“自動交易進行中”這一節);當前bar的收盤時間為14:00(圖表上最後一根bar,最新的bar),已經收盤(即barstatus=2),並且還沒有接收到下一根bar的開盤tick,那麼此時開啟自動交易,條件單需要等到下一根bar的開盤tick,基於下一根bar的barstatus=0進行“委託單條件判斷”這個步驟,然後等待接下來bar內狀態、bar的收盤狀態、bar的開盤狀態進行“委託單觸發”這個步驟(市價單需要在開啟自動交易之後,基於實時的開盤tick進行“委託單條件判斷”,然後等待接下來bar內狀態、bar的收盤狀態、bar的  開盤狀態進行“委託單觸發”這個步驟)。

  3.2開啟bar內模式

  開啟bar內模式,圖表上最新的bar(假設是相對編號為14的bar)已經開盤,但是還沒有收盤,那麼此時開啟自動交易,此時條件單基於開啟自動交易之前最後一筆歷史tick同時進行“委託單條件判斷”和“委託單觸發”這兩個步驟,也就是說當“委託單條件判斷”條件成立就直接傳送到交易所(市價單在開啟自動交易之後進行“委託單條件判斷”和“委託單觸發”這兩個步驟);開啟bar內模式,圖表上最新的bar(假設是相對編號為14的bar)已經收盤,然後此時開啟自動交易,此時條件單和市價單基於編號為14的bar的收盤tick進行“委託單條件判斷”,然後等待下一根bar的開盤tick進行“委託單觸發”這個步驟。

  3.3開啟bar外模式

  開啟bar外模式,當前圖表上新一根bar(假設相對編號為14),已經收盤,並且下一根bar還沒有開盤,那麼此時開啟自動交易,條件單會基於開啟自動交易前最後一筆tick進行“委託單條件判斷”,然後直接傳送到交易所,也就是說此時“委託單條件判斷”和“委託單觸發”這兩個步驟同時進行(市價單會基於開啟自動交易之前最後一筆tick進行“委託單條件判斷,然後等待下一根bar的開盤tick進行“委託單觸發”這個步驟,但是並不會基於bar外狀態進行“委託單觸發”這個步驟)。

開啟bar外模式,當前圖表上最新一根bar(假設相對編號為14),已經開盤,還沒有收盤,那麼此時開啟自動交易,之後條件單和市價單的情況請參考上一節3.2的闡述。

【思維導圖1】:委託單的發單機制包括兩部分:

【思維導圖2】:

  對於this bar,“委託單條件判斷”和“委託單觸發”是一個步驟,委託單條件判斷成立同時,同步“委託單觸發”直接傳送給交易所(this bar)。

  對於next bar,“委託單條件判斷”和“委託單觸發”是兩個步驟,“委託單條件判斷成立同時”,非同步觀察“委託單觸發”條件是否成立(next bar)

【思維導圖3】:next bar和this bar適用於那種交易狀態

【思維導圖4】:自動交易進行中---開啟bar內模式/未開啟bar內模式---next bar基於開啟bar內模式和未開啟bar內模式的計算方式

【思維導圖5】:自動交易進行中---開啟bar外模式----next基於開盤狀態和收盤狀態的“條件判斷”和“委託單執行”的不同

思維導圖6】:開啟交易瞬間---開啟bar內模式/未開啟bar內模式---next bar基於開啟bar內模式和未開啟bar內模式的計算方式

【思維導圖7】同思維導圖5

【總結1】

  開啟自動化,儘量要在收盤之後,或者開盤之前。

  交易模式分:非bar內模式、bar內模式、bar外模式

      區別:非bar內模式,barStatus=0/2

      區別:bar內模式,barStatus=0/1/2

      區別:bar外模式,barStatus=-1

【備註】:造成bar外情況,也就是barStatus=-1,產生bar外模式,有可能在多週期,集合競價時產生,此時的barStatus既不是開盤0,盤中1,收盤2,此時就會產生第四種狀態barStatus=-1,如果要允許終端時間發單,那麼就要開啟bar外模式AllowSendOrdersAlways=true。

=================================================

之前的文章感謝大家的轉載,希望轉載時請註明出處,本人轉自其它網站的圖表一併感謝,謝謝~!

https://www.cnblogs.com/noah0532/