Backtrader交易基础2
成交價格確定:
Order.Market
市價單,以當時市場價格成交的訂單,不需要自己設(shè)定價格。市價單能被快速達成交易,防止踏空,盡快止損/止盈;
按下一個 Bar (即生成訂單的那個交易日的下一個交易日)的開盤價來執(zhí)行成交;
例:self.buy(exectype=bt.Order.Market) 。
Order.Close
和 Order.Market 類似,也是市價單,只是成交價格不一樣;
按下一個 Bar 的收盤價來執(zhí)行成交;
例:self.buy(exectype=bt.Order.Close) 。
Order.Limit
限價單,需要指定成交價格,只有達到指定價格(limit Price)或有更好價格時才會執(zhí)行,即以指定價或低于指點價買入,以指點價或更高指定價賣出;
在訂單生成后,會通過比較 limit Price 與之后 Bar 的 open\high\low\close 行情數(shù)據(jù)來判斷訂單是否成交。
如果下一個 Bar 的 open 觸及到指定價格 limit Price,就以 open 價成交,訂單在這個 Bar 的開始階段就被執(zhí)行完成;
如果下一個 Bar 的 open 未觸及到指定價格 limit Price,但是 limit Price 位于這個 bar 的價格區(qū)間內(nèi) (即 low ~ ?high),就以 limit Price 成交;
例:self.buy(exectype=bt.Order.Limit, price=price, valid=valid) 。
Order.Stop
止損單,需要指定止損價格(Stop Price),一旦股價突破止損價格,將會以市價單的方式成交;
在訂單生成后,也是通過比較 Stop Price 與之后 Bar 的 open\high\low\close 行情數(shù)據(jù)來判斷訂單是否成交。
如果下一個 Bar 的 open 觸及到指定價格 limit Price,就以 open 價成交;如果下一個 Bar 的 open 未觸及到指定價格 Stop Price,
但是 Stop Price 位于這個 bar 的價格區(qū)間內(nèi) (即 low ~ high),就以 Stop Price 成交;
例:self.buy(exectype=bt.Order.Stop, price=price, valid=valid) 。
Order.StopLimit
止損限價單,需要指定止損價格(Stop price)和限價(Limit Price),一旦股價達到設(shè)置的止損價格,將以限價單的方式下單;
在下一個 Bar,按 Order.Stop 的邏輯觸發(fā)訂單,然后以 Order.Limit 的邏輯執(zhí)行訂單;
例:self.buy(exectype=bt.Order.StopLimit, price=price, valid=valid, plimit=plimit)。
Order.StopTrail
跟蹤止損訂單,是一種止損價格會自動調(diào)整的止損單,調(diào)整范圍通過設(shè)置止損價格和市場價格之間的差價來確定。
差價即可以用金額 trailamount 表示,也可以用市價的百分比 trailpercent ?表示;
如果是通過 buy 下達了買入指令,就會“賣出”一個跟蹤止損單,在市場價格上升時,止損價格會隨之上升;
若股價觸及止損價格時,會以市價單的形式執(zhí)行訂單;若市場價格下降或保持不變,止損價格會保持不變;
如果是通過 sell 下達賣出指令,就會“買入”一個跟蹤止損單,在市場價格下降時,止損價格會隨之下降;
若股價觸及止損價格時,會以市價單的形式執(zhí)行訂單;但是當市場價格上升時,止損價格會保持不變;
例:self.buy(exectype=bt.Order.StopTrail, price=xxx, trailamount=xxx)。
Order.StopTrailLimit
跟蹤止損限價單,是一種止損價格會自動調(diào)整的止損限價單,訂單中的限價 Limit Price 不會發(fā)生變動,止損價會發(fā)生變動,變動邏輯與上面介紹的跟蹤止損訂單一致;
例:self.buy(exectype=bt.Order.StopTrailLimit, plimit=xxx, trailamount=xxx) 。
交易函數(shù):
1.常規(guī)下單函數(shù)
Strategy 中的常規(guī)下單函數(shù)主要有 3 個:買入 buy() 、賣出 sell()、平倉 close() ,
它們的調(diào)用方式非常簡單,大家也經(jīng)常在案例中看到,交易函數(shù)會返回訂單 Order 實例,通常會賦值給對象self.order :
參數(shù)說明:
調(diào)用的 buy、sell、close 方法中支持設(shè)置的參數(shù)有:
data(默認: None):用于指定給哪個數(shù)據(jù)集(即哪個證券)創(chuàng)建訂單,默認為 None,表示給第 1 個數(shù)據(jù)集(self.datas[0] 、self.data0 對應(yīng)的證券)創(chuàng)建訂單。
size(默認: None):訂單委托數(shù)量(正數(shù)),默認為 None,表示會自動通過 getsizer 獲取 sizer 。
price(默認: None):訂單委托價, None 表示不指定具體的委托價,而是由市場決定最終的成交價,適用于市價單;對于限價單、止損單和止損限價單,price 就是觸發(fā)訂單執(zhí)行的那個價格 。
plimit(默認: None):僅適用于 StopLimit 訂單,用于指定 StopLimit 訂單的限價 Limit Price 為多少。
exectype (默認: None):執(zhí)行的訂單類型,None 表示按市價單執(zhí)行,可選的類型有:
1. Order.Market ?市價單,回測時將以下一個 bar 的開盤價執(zhí)行的市價單 ;
2. Order.Close ?市價單,回測時將以下一個 bar 的收盤價執(zhí)行的市價單;
3. Order.Limit ?限價單;
4. Order.Stop ?止損單;
5. Order.StopLimit ?止損現(xiàn)價單;
6. Order.StopTrail ?跟蹤止損訂單;
7. Order.StopTrailLimit ?跟蹤止損限價單。
valid(默認: None):訂單有效期,可選取值有:
1. None 表示訂單在完成成交或被撤銷之前一直都有效(aka Good till cancel or match);?
2. datetime實例、date 實例、數(shù)值形式的日期,表示訂單在設(shè)置的 date 之前有效,date 之后會被撤銷(aka good till date);
3. Order.DAY 、0 、imedelta(),表示訂單當日有效,未成交的訂單將在當日收盤后被自動撤銷(aka day order)。
tradeid(默認: None):當同一資產(chǎn)出現(xiàn)重復(fù)交易的時候,通知訂單狀態(tài)更改時,tradeid 會被傳遞給 Strategy。
**kwargs:通過傳入其他參數(shù),生成特定類型的訂單 。
2.目標下單函數(shù)
目標下單函數(shù)包括按目標數(shù)量下單、按目標金額下單、按目標百分比下單,這些下單函數(shù)會根據(jù)設(shè)置的目標來選擇買賣方向:
class TestStrategy(bt.Strategy):def next(self):# 按目標數(shù)量下單self.order = self.order_target_size(target=size)# 按目標金額下單self.order = self.order_target_value(target=value)# 按目標百分比下單self.order = self.order_target_percent(target=percent)參數(shù)說明:
order_target_size:按目標數(shù)量下單,按“多退少補”的原則,讓證券的持倉數(shù)量等于設(shè)定的目標數(shù)量 target :
如果目標數(shù)量 target 大于當前持倉數(shù)量,則會發(fā)出買入訂單,補足持倉量,例如:
當前持倉量 size=0, 目標持倉量 target=7 -> 買入訂單,買入數(shù)量 size=7-0=7;
當前持倉量 size=3, 目標持倉量 target=7 -> 買入訂單,買入數(shù)量 size=7-3=4;
當前持倉量 size=-3, 目標持倉量 target=7 -> 買入訂單,買入數(shù)量 size=7-(-3)=10。
如果目標數(shù)量 target 小于當前持倉數(shù)量,則會發(fā)出賣出訂單,減少持倉量,例如:
當前持倉量 size=0,目標持倉量 target=-7 -> 賣出訂單,賣出數(shù)量 size=0-(-7)=7;
當前持倉量 size=3, 目標持倉量 target=-7 -> 賣出訂單,賣出數(shù)量 size=3-(-7)=10;
當前持倉量 size=-3, 目標持倉量 target=-7 -> 賣出訂單,賣出數(shù)量 size=-3-(-7)=4。
order_target_value:按目標金額下單,通過比較目標金額與當前持倉額和持倉方向,確定最終買賣買賣方向:(持倉量默認使用當前 Bar 的 close 進行計算,然后以下一根 bar 的開盤價進行交易)
如果當前持有的是空單(size<0):
若目標金額 target > 當前持倉額 -> ?賣出;
若目標金額 target < 當前持倉額 -> 買入。
如果當前無持倉或持有的是多單(size>=0):
若目標金額 target > 當前持倉額 -> ?買入;
若目標金額 target < 當前持倉額 -> ?賣出。
order_target_percent:按目標百分比下單,訂單生成邏輯同 order_target_value,目標金額 = 目標百分比 * 當前賬戶的總資產(chǎn)。
取消訂單
交易函數(shù)用于生成訂單,返回 Order 對象,如果想要取消生成的訂單,就可以通過 cancel() 方法來取消:
通過 cancel() 來取消訂單 :self.cancel(order);
通過 Broker 來取消訂單 :self.broker.cancel(order) 。
訂單組合:
buy_bracket()
buy_bracket() 用于long side 的交易場景,買入證券后,在價格下跌時,希望通過止損單賣出證券,限制損失;
在價格上升時,希望通過限價單賣出證券,及時獲利,通過 buy_bracket() 可以同時提交上述 3 個訂單,而無需繁瑣的調(diào)用 3 次常規(guī)交易函數(shù)。
參數(shù)說明:
從 buy_bracket 的可用參數(shù)可知:
data=None,默認是對 data0 數(shù)據(jù)集對應(yīng)的證券標的進行交易;
主訂單:為買入單,默認為 Order.Limit ?限價單,可通過參數(shù) price 設(shè)定成交價,也可通過參數(shù) ?plimit 設(shè)置指定價 limit;主訂單通常設(shè)置為 Order.Limit ?限價單 或 Order.StopLimit 止損限價單;
止損單:為賣出單,用于及時止損,默認為 Order.Stop 止損單,可通過參數(shù) stopprice 設(shè)置止損價,參數(shù) stopargs 中還可設(shè)置止損單相關(guān)的其他參數(shù);
止盈單:為賣出單,用于及時止盈,默認為 Order.Limit 限價單,可通過參數(shù) limitprice 設(shè)置指定價格,參數(shù) limitargs 中還可設(shè)置限價單相關(guān)的其他參數(shù)。
sell_bracket()
sell_bracket() 用于short side 的交易場景,賣出證券做空后,在價格上升時,希望通過止損單買入證券,限制損失;
在價格下降時,希望通過限價單買入證券,及時獲利,sell_bracket() 也是一次同時提交上述 3 個訂單 。
Broker 中的交易執(zhí)行
Broker 在執(zhí)行交易時,會根據(jù)執(zhí)行流程給訂單賦予不同的狀態(tài),不同階段的訂單狀態(tài)可以通過Strategy 中定義 notify_order() 方法來捕獲,
從而進行自定義的處理,從下達交易指令到訂單執(zhí)行結(jié)束,訂單可能會依次呈現(xiàn)如下狀態(tài):
Order.Created:訂單已被創(chuàng)建;
Order.Submitted:訂單已被傳遞給經(jīng)紀商 Broker;
Order.Accepted:訂單已被經(jīng)紀商接收;
Order.Partial:訂單已被部分成交;
Order.Complete:訂單已成交;
Order.Rejected:訂單已被經(jīng)紀商拒絕;
Order.Margin:執(zhí)行該訂單需要追加保證金,并且先前接受的訂單已從系統(tǒng)中刪除;
Order.Cancelled (or Order.Canceled):確認訂單已經(jīng)被撤銷;
Order.Expired:訂單已到期,其已經(jīng)從系統(tǒng)中刪除 。 ? ?
總結(jié)
以上是生活随笔為你收集整理的Backtrader交易基础2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【2022】多线程并发编程面试真题
- 下一篇: 软件可靠性