在目前新版的聚寬教程中,推薦使用run_daily(自定義函數,頻率)來替代原來的handle_data(context,data)函數
推薦的示例如下:
def initialize(context):
run_daily(period,time='every_bar')
g.security = '000001.XSHE'
def period(context):
order(g.security, 100)
我們在參考社區里面的老的策略代碼的時候,還有一些策略使用的是老的框架結構。如果想借用原來handle_data中的邏輯,放到自己定義的函數中,就會碰到對data對象引用的問題。
def period(context,data):在編譯運行時會碰到下面的報錯:
TypeError: period() missing 1 required positional argument: 'data'
考慮到data對象的屬性在get_price()返回的對象中都有,幾個基本的屬性和get_current_data()得到的對象屬性類似,可以采取下列辦法
def period(context):
current_data = get_current_data() #用get_current_data()或者get_price()的返回對象來替代data對象
# 得到當前價格
#price = data[security].price #data對象中的當前價用的是price
price = current_data[security].last_price #get_current_data()返回的對象中,當前價用的是last_price
......
order(g.security, 100)
就是用get_current_data()或者get_price()的返回對象來替代data對象,注意兩種對象的引用方式和屬性名稱不完全一致,因此要對相關的語句做適當的修改。
get_current_data() 詳見API中的get_current_data
返回值是一個dict, 其中 key 是股票代碼, value 是擁有如下屬性的對象
last_price : 最新價
high_limit: 漲停價
low_limit: 跌停價
paused: 是否停止或者暫停了交易, 當停牌、未上市或者退市後返回 True
is_st: 是否是 ST(包括ST, ST),是則返回 True,否則返回 False
day_open: 當天開盤價
name: 股票現在的名稱, 可以用這個來判斷股票當天是否是 ST, ST, 是否快要退市
industry_code: 股票現在所屬行業代碼
get_price()用起來相對複雜一些,參數比較多,返回信息也多。詳細情況見API中的get_price:
get_price(security, start_date=None, end_date=None, frequency='daily', fields=None, skip_paused=False, fq='pre', count=None)
返回值支持SecurityUnitData里面的所有基本屬性,,包含:['open', 'close', 'low', 'high', 'volume', 'money', 'factor', 'high_limit','low_limit', 'avg', 'pre_close', 'paused'],其中paused為1表示停牌。
API中對於data對象的說明見API中的SecurityUnitData:
SecurityUnitData data對象
不知道大家有什麼更好的辦法?