Backtrader交易基礎2

成交價格確定:

Order.Market
市價單,以當時市場價格成交的訂單,不需要自己設定價格。市價單能被快速達成交易,防止踏空,盡快止損/止盈;

按下一個 Bar (即生成訂單的那個交易日的下一個交易日)的開盤價來執行成交;

例:self.buy(exectype=bt.Order.Market) 。

Order.Close
和 Order.Market 類似,也是市價單,只是成交價格不一樣;
按下一個 Bar 的收盤價來執行成交;
例:self.buy(exectype=bt.Order.Close) 。

Order.Limit
限價單,需要指定成交價格,只有達到指定價格(limit Price)或有更好價格時才會執行,即以指定價或低于指點價買入,以指點價或更高指定價賣出;
在訂單生成后,會通過比較 limit Price 與之后 Bar 的 open\high\low\close 行情數據來判斷訂單是否成交。
如果下一個 Bar 的 open 觸及到指定價格 limit Price,就以 open 價成交,訂單在這個 Bar 的開始階段就被執行完成;
如果下一個 Bar 的 open 未觸及到指定價格 limit Price,但是 limit Price 位于這個 bar 的價格區間內 (即 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 行情數據來判斷訂單是否成交。
如果下一個 Bar 的 open 觸及到指定價格 limit Price,就以 open 價成交;如果下一個 Bar 的 open 未觸及到指定價格 Stop Price,
但是 Stop Price 位于這個 bar 的價格區間內 (即 low ~ high),就以 Stop Price 成交;
例:self.buy(exectype=bt.Order.Stop, price=price, valid=valid) 。

Order.StopLimit
止損限價單,需要指定止損價格(Stop price)和限價(Limit Price),一旦股價達到設置的止損價格,將以限價單的方式下單;
在下一個 Bar,按 Order.Stop 的邏輯觸發訂單,然后以 Order.Limit 的邏輯執行訂單;
例:self.buy(exectype=bt.Order.StopLimit, price=price, valid=valid, plimit=plimit)。

Order.StopTrail
跟蹤止損訂單,是一種止損價格會自動調整的止損單,調整范圍通過設置止損價格和市場價格之間的差價來確定。
差價即可以用金額 trailamount 表示,也可以用市價的百分比 trailpercent ?表示;
如果是通過 buy 下達了買入指令,就會“賣出”一個跟蹤止損單,在市場價格上升時,止損價格會隨之上升;
若股價觸及止損價格時,會以市價單的形式執行訂單;若市場價格下降或保持不變,止損價格會保持不變;
如果是通過 sell 下達賣出指令,就會“買入”一個跟蹤止損單,在市場價格下降時,止損價格會隨之下降;
若股價觸及止損價格時,會以市價單的形式執行訂單;但是當市場價格上升時,止損價格會保持不變;
例:self.buy(exectype=bt.Order.StopTrail, price=xxx, trailamount=xxx)。

Order.StopTrailLimit
跟蹤止損限價單,是一種止損價格會自動調整的止損限價單,訂單中的限價 Limit Price 不會發生變動,止損價會發生變動,變動邏輯與上面介紹的跟蹤止損訂單一致;
例:self.buy(exectype=bt.Order.StopTrailLimit, plimit=xxx, trailamount=xxx) 。

交易函數:

1.常規下單函數
Strategy 中的常規下單函數主要有 3 個:買入 buy() 、賣出 sell()、平倉 close() ,
它們的調用方式非常簡單,大家也經常在案例中看到,交易函數會返回訂單 Order 實例,通常會賦值給對象self.order :

class TestStrategy(bt.Strategy):def next(self):self.order = self.buy( ...) # 買入、做多 longself.order = self.sell(...) # 賣出、做空 shortself.order = self.close(...) # 平倉 cover

參數說明:

調用的 buy、sell、close 方法中支持設置的參數有:

data(默認: None):用于指定給哪個數據集(即哪個證券)創建訂單,默認為 None,表示給第 1 個數據集(self.datas[0] 、self.data0 對應的證券)創建訂單。
size(默認: None):訂單委托數量(正數),默認為 None,表示會自動通過 getsizer 獲取 sizer 。
price(默認: None):訂單委托價, None 表示不指定具體的委托價,而是由市場決定最終的成交價,適用于市價單;對于限價單、止損單和止損限價單,price 就是觸發訂單執行的那個價格 。
plimit(默認: None):僅適用于 StopLimit 訂單,用于指定 StopLimit 訂單的限價 Limit Price 為多少。


exectype (默認: None):執行的訂單類型,None 表示按市價單執行,可選的類型有:
1. Order.Market ?市價單,回測時將以下一個 bar 的開盤價執行的市價單 ;

2. Order.Close ?市價單,回測時將以下一個 bar 的收盤價執行的市價單;

3. Order.Limit ?限價單;

4. Order.Stop ?止損單;

5. Order.StopLimit ?止損現價單;

6. Order.StopTrail ?跟蹤止損訂單;

7. Order.StopTrailLimit ?跟蹤止損限價單。


valid(默認: None):訂單有效期,可選取值有:
1. None 表示訂單在完成成交或被撤銷之前一直都有效(aka Good till cancel or match);?

2. datetime實例、date 實例、數值形式的日期,表示訂單在設置的 date 之前有效,date 之后會被撤銷(aka good till date);

3. Order.DAY 、0 、imedelta(),表示訂單當日有效,未成交的訂單將在當日收盤后被自動撤銷(aka day order)。
tradeid(默認: None):當同一資產出現重復交易的時候,通知訂單狀態更改時,tradeid 會被傳遞給 Strategy。

**kwargs:通過傳入其他參數,生成特定類型的訂單 。

2.目標下單函數

目標下單函數包括按目標數量下單、按目標金額下單、按目標百分比下單,這些下單函數會根據設置的目標來選擇買賣方向:

class TestStrategy(bt.Strategy):def next(self):# 按目標數量下單self.order = self.order_target_size(target=size)# 按目標金額下單self.order = self.order_target_value(target=value)# 按目標百分比下單self.order = self.order_target_percent(target=percent)

參數說明:

order_target_size:按目標數量下單,按“多退少補”的原則,讓證券的持倉數量等于設定的目標數量 target :
如果目標數量 target 大于當前持倉數量,則會發出買入訂單,補足持倉量,例如:

當前持倉量 size=0, 目標持倉量 target=7 -> 買入訂單,買入數量 size=7-0=7;

當前持倉量 size=3, 目標持倉量 target=7 -> 買入訂單,買入數量 size=7-3=4;

當前持倉量 size=-3, 目標持倉量 target=7 -> 買入訂單,買入數量 size=7-(-3)=10。

如果目標數量 target 小于當前持倉數量,則會發出賣出訂單,減少持倉量,例如:

當前持倉量 size=0,目標持倉量 target=-7 -> 賣出訂單,賣出數量 size=0-(-7)=7;

當前持倉量 size=3, 目標持倉量 target=-7 -> 賣出訂單,賣出數量 size=3-(-7)=10;

當前持倉量 size=-3, 目標持倉量 target=-7 -> 賣出訂單,賣出數量 size=-3-(-7)=4。
order_target_value:按目標金額下單,通過比較目標金額與當前持倉額和持倉方向,確定最終買賣買賣方向:(持倉量默認使用當前 Bar 的 close 進行計算,然后以下一根 bar 的開盤價進行交易)
如果當前持有的是空單(size<0):

若目標金額 target > 當前持倉額 -> ?賣出;

若目標金額 target < 當前持倉額 -> 買入。
如果當前無持倉或持有的是多單(size>=0):

若目標金額 target > 當前持倉額 -> ?買入;

若目標金額 target < 當前持倉額 -> ?賣出。
order_target_percent:按目標百分比下單,訂單生成邏輯同 order_target_value,目標金額 = 目標百分比 * 當前賬戶的總資產。

取消訂單

交易函數用于生成訂單,返回 Order 對象,如果想要取消生成的訂單,就可以通過 cancel() 方法來取消:

通過 cancel() 來取消訂單 :self.cancel(order);
通過 Broker 來取消訂單 :self.broker.cancel(order) 。

訂單組合:

buy_bracket()
buy_bracket() 用于long side 的交易場景,買入證券后,在價格下跌時,希望通過止損單賣出證券,限制損失;
在價格上升時,希望通過限價單賣出證券,及時獲利,通過 buy_bracket() 可以同時提交上述 3 個訂單,而無需繁瑣的調用 3 次常規交易函數。

# 函數可用參數
buy_bracket(# 主訂單的參數data=None, size=None, price=None,plimit=None,exectype=bt.Order.Limit,valid=None, tradeid=0,trailamount=None, trailpercent=None,oargs={},# 止損單的參數stopprice=None, stopexec=bt.Order.Stop, stopargs={},# 止盈單的參數limitprice=None, limitexec=bt.Order.Limit, limitargs={},**kwargs):......# 調用示例
brackets = self.buy_bracket(price=13.50,limitprice=14.00,stopprice=13.00)
# 主訂單以 13.5 的價格買入 self.data0 數據集對應的標的
# 當價格超過 14.00 時,會觸發止盈單,賣出標的
# 當價格跌破 13.00 時,會觸發止損單,賣出標的

參數說明:

從 buy_bracket 的可用參數可知:

data=None,默認是對 data0 數據集對應的證券標的進行交易;


主訂單:為買入單,默認為 Order.Limit ?限價單,可通過參數 price 設定成交價,也可通過參數 ?plimit 設置指定價 limit;主訂單通常設置為 Order.Limit ?限價單 或 Order.StopLimit 止損限價單;


止損單:為賣出單,用于及時止損,默認為 Order.Stop 止損單,可通過參數 stopprice 設置止損價,參數 stopargs 中還可設置止損單相關的其他參數;


止盈單:為賣出單,用于及時止盈,默認為 Order.Limit 限價單,可通過參數 limitprice 設置指定價格,參數 limitargs 中還可設置限價單相關的其他參數。
sell_bracket()
sell_bracket() 用于short side 的交易場景,賣出證券做空后,在價格上升時,希望通過止損單買入證券,限制損失;
在價格下降時,希望通過限價單買入證券,及時獲利,sell_bracket() 也是一次同時提交上述 3 個訂單 。

# 函數可用參數
sell_bracket(# 主訂單設置data=None,size=None, price=None, plimit=None,exectype=bt.Order.Limit, valid=None, tradeid=0,trailamount=None, trailpercent=None, oargs={},# 止損單設置stopprice=None, stopexec=bt.Order.Stop, stopargs={},# 止盈單設置limitprice=None, limitexec=bt.Order.Limit, limitargs={},**kwargs):# 調用示例
brackets = self.sell_bracket(price=13.50,limitprice=13.00,stopprice=14.00)
# 主訂單以 13.5 的價格賣出 self.data0 數據集對應的標的
# 當價格跌破 13.00 時,會觸發止盈單,買入標的,獲得套利收益
# 當價格超過 14.00 時,會觸發止損單,買入標的,及時止損

Broker 中的交易執行

Broker 在執行交易時,會根據執行流程給訂單賦予不同的狀態,不同階段的訂單狀態可以通過Strategy 中定義 notify_order() 方法來捕獲,
從而進行自定義的處理,從下達交易指令到訂單執行結束,訂單可能會依次呈現如下狀態:

Order.Created:訂單已被創建;
Order.Submitted:訂單已被傳遞給經紀商 Broker;
Order.Accepted:訂單已被經紀商接收;
Order.Partial:訂單已被部分成交;
Order.Complete:訂單已成交;
Order.Rejected:訂單已被經紀商拒絕;
Order.Margin:執行該訂單需要追加保證金,并且先前接受的訂單已從系統中刪除;
Order.Cancelled (or Order.Canceled):確認訂單已經被撤銷;
Order.Expired:訂單已到期,其已經從系統中刪除 。 ? ?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449515.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449515.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449515.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows 小技巧

2019獨角獸企業重金招聘Python工程師標準>>> 桌面圖標顯示不全、圖標呈現白色方塊 ie4uinit -show 關閉占用指定端口的進程 獲取進程: netstat -ano | findstr 端口號關閉進程&#xff1a;taskkill -f -pid 進程號文件被占用 打開任務管理器&#xff0c;切換到 性能…

進一步了解 apt-get 的幾個命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 用 apt-get 也很久了&#xff0c;沒多想它的實現&#xff0c;最近遇到 gstreamer 裝不上的問題&#xff0c;才多看看了它 apt-get 就是…

java學習筆記20(Arraylist復習,Collection接口方法,迭代器,增強型for循環)

集合&#xff1a;集合是Java提供的一種容器&#xff0c;可以用來存儲多個數據&#xff1b; 集合與數組的區別&#xff1a;集合的長度是可變的&#xff0c;數組的長度是固定的 集合中存儲的數據必須是引用類型數據&#xff1b; ArrayList回顧&#xff1a; public class Person {…

backtrader數據基礎

cerebro bt.Cerebro() cerebro.addstrategy(TestStrategy2) codes[600862.SH,300326.SZ,300394.SZ] #加載最近兩日交易數據 for code in codes:feed Addmoredata(dataname get_data(code,20200506),namecode)cerebro.adddata(feed) cerebro.run() 數據查看&#xff1a; cl…

談判學:三招了解對方底線

導讀&#xff1a;談判者都希望能了解對方的底線&#xff0c;最直接的一招就是將對手變成“朋友”&#xff0c;只是這種“內奸法”畢竟不是常規之法。大多數情況下&#xff0c;談判雙方也不可能像《無間道》一樣在對方陣營安放臥底&#xff0c;但是我們完全可以通過一些辦法來揣…

JSLint檢測Javascript語法規范

前端javascript代碼編寫中&#xff0c;有一個不錯的工具叫JSLint&#xff0c;可以檢查代碼規范化&#xff0c;壓縮JS&#xff0c;CSS等&#xff0c;但是他的語法規范檢查個人覺得太“苛刻”了&#xff0c;會提示各種各樣的問題修改建議&#xff0c;有時候提示的信息我們看的莫名…

Apt 命令解說(apt-get update、apt-cache search package、apt-get install package、apt-get remove )

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 高級打包工具&#xff08;英語&#xff1a;Advanced Packaging Tools&#xff0c;縮寫為APT&#xff09;是Debian及其派生發行版的軟件包…

SQL SERVER 2012 AlwaysOn - 維護篇 03

搭建 AlwaysOn 是件非常繁瑣的工作&#xff0c;需要從兩方面考慮&#xff0c;操作系統層面和數據庫層面&#xff0c;AlwaysOn 非常依賴于操作系統&#xff0c;域控&#xff0c;群集&#xff0c;節點等概念&#xff1b; DBA 不但要熟悉數據庫也要熟悉操作系統的一些概念&#xf…

指標研究與多周期

哪些地方會用到指標 &#xff1f; 回顧一下 Backtrader 的主要功能模塊和回測流程&#xff08;見&#xff1a;Backtrader 來了&#xff01;&#xff09;可以發現&#xff0c;只有在編寫策略Strategy 時才會涉及到指標的計算和使用&#xff0c;而且是 Strategy 中的 __init__()…

區塊鏈BAAS平臺:公共或私人區塊鏈編程以用于各種用途

2019獨角獸企業重金招聘Python工程師標準>>> 人們可以為公共或私人區塊鏈編程以用于各種用途。理論上&#xff0c;我認為犧牲權力下放的方面可以解決區塊鏈技術背后的許多當前問題。區塊鏈仍然可以包容&#xff0c;而不是分散。這如何解決當前的一些問題&#xff1f…

CURL 是什么

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 cURL是一個利用URL語法在命令行下工作的文件傳輸工具&#xff0c;1997年首次發行。 它支持文件上傳和下載&#xff0c;所以是綜合傳輸工…

易用性問題回復

針對淘寶網為例&#xff0c;以一次完整的購物流程為背景&#xff0c;我們分析了在淘寶網中的一些易用性的體現&#xff0c;主要場景如下圖所示: 在本場景中&#xff0c;新用戶下載淘寶app時&#xff0c;第一次打開應用&#xff0c;淘寶app會出現新手指引&#xff0c;教會用戶如…

易盛極星期貨量化教學

我目前量化實盤做期貨交易用的是這個軟件。主要就是因為它可以做套利合約&#xff0c;還有就是國企的外包&#xff0c;安全&#xff08;vnpy的狗咬狗害怕&#xff09;。 策略模板&#xff1a; 設置全局參數變量&#xff1a; #導入包 import talib #選擇合約代碼 code1 #設…

eBay是如何進行大數據集元數據發現的

很多大數據系統每天都會收集數PB的數據。這類系統通常主要用于查詢給定時間范圍內的原始數據記錄&#xff0c;并使用了多個數據過濾器。但是&#xff0c;要發現或識別存在于這些大型數據集中的唯一屬性可能很困難。 在大型數據集上執行運行時聚合&#xff08;例如應用程序在特定…

職業發展 先“立功”還是先“安內”?

導讀&#xff1a;職業生涯更上一層樓&#xff0c;章良躊躇滿志&#xff0c;想在短期內建功立業&#xff0c;奠定江湖地位。但他清楚&#xff0c;自己運籌中的分公司服務升級計劃&#xff0c;對公司整體和自己的職業生涯都非常有利&#xff0c;卻將不可避免地轉移老將掌握的部分…

網關 Kong 折騰筆記 - 相關技術清單

背景 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 公司準備更好的實現微服務架構&#xff0c;我前期的任務主要是 API 開發相關的技術學習&#xff0c;微服務會隨著業務的增加不斷增加…

Quantaxis更新數據到最新

登錄QQ群&#xff1a;563280067 安裝方法&#xff1a; 1.進入命令界面&#xff0c; 2.pip install pytdx-1.72r2-py3-none-any.whl 3. pip install quantaxis-1.10.19r1-py3-none-any.whl 之后輸入save save all 即可看到所有的數據全部安裝到位

Java各進制之間的轉換

十進制轉成十六進制&#xff1a; Integer.toHexString(int i) 十進制轉成八進制 Integer.toOctalString(int i) 十進制轉成二進制 Integer.toBinaryString(int i) 十六進制轉成十進制 Integer.valueOf("FFFF",16).toString() 八進制轉成十進制 Integer.valueOf("…

mingW與cygwin 異同

首先MingW和cygwin都可以用來跨平臺開發。 MinGW是Minimalistic GNU for Windows的縮寫&#xff0c;也就是Win版的GCC。 Cygwin則是全面模擬了Linux的接口&#xff0c;提供給運行在它上面的的程序使用&#xff0c;并提供了大量現成的軟件&#xff0c;更像是一個平臺。 相…

shell字符串的用法

shell字符串的用法 注意&#xff1a;shell4.2和shell4.1會有差別&#xff0c;較低版本的shell可能不支持某些功能 獲取字符串長度&#xff1a;${#string}獲取子串&#xff1a; 注&#xff1a;&#xff08;左邊的第一個字符是用 0 表示&#xff0c;右邊的第一個字符用 0-1 表示&…