'''
1、首先計算:
(1)N日High的最高價HH, N日Close的最低價LC;
(2)N日Close的最高價HC,N日Low的最低價LL;
(3)Range = Max(HH-LC,HC-LL)
(4)BuyLine = Open + K1*Range
(5)SellLine = Open + K2*Range
2.構造系統
(1)當價格向上突破上軌時,如果當時持有空倉,則先平倉,再開多倉;如果沒有持倉,則直接開多倉;
(2)當價格向下突破下軌時,如果當時持有多倉,則先平倉,再開空倉;如果沒有持倉,則直接開空倉;
'''
def initialize(context):
# 設定滬深300作為基準
set_benchmark('000300.XSHG')
# True為開啟動態復權模式,使用真實價格交易
set_option('use_real_price', True)
# 設定成交量比例
set_option('order_volume_ratio', 1)
# 關閉訂單提醒
# log.set_level('order', 'error')
# 設定期貨保證金比例
set_option('futures_margin_rate', 0.3)
# 設定操作金融期貨
set_subportfolios([SubPortfolioConfig(cash=context.portfolio.cash, type='index_futures')])
# 金融期貨close_today_commission可不用設定,平今倉默認0.0023
set_order_cost(OrderCost(open_commission=0.000023, close_commission=0.000023, close_today_commission=0.0023), type='index_futures')
#運行函數
run_daily(set_info, time='before_open', reference_security='IF1512.CCFX')
run_daily(trade, time='every_bar', reference_security='IF1512.CCFX')
def set_info(context):
# 分鐘計數
g.minute_count = 0
def trade(context):
# 開盤第一分鐘
if g.minute_count == 0:
# 獲取當月可交易的 HS300 股指期貨合約
g.security = get_stock_index_futrue_code(context,symbol='IF',month='current_month')
# 獲取 BuyLine, SellLine
g.BuyLine, g.SellLine = dual_thrust(g.security,n=10,K1=0.5,K2=0.5)
# 分鐘計數
g.minute_count += 1
# 開盤第一分鐘之后
else:
# 獲取標的可平多倉
long_closeable_amount = context.portfolio.long_positions[g.security].closeable_amount
# 獲取標的可平空倉
short_closeable_amount = context.portfolio.short_positions[g.security].closeable_amount
# 獲取標的的最新價
current_price = attribute_history(g.security, 1, '1m', ['close'], df=False)['close'][0]
# 當價格向上突破上軌時
if current_price > g.BuyLine:
# 如果當時持有空倉,則先平倉,再開多倉;
if(short_closeable_amount>0):
# 平空倉
order_target(g.security, 0 , side='short')
# 開1手多倉
order(g.security, 1, side='long')
log.info('持有空倉,先平倉,再開多倉')
# 如果沒有持倉,則直接開多倉;
elif (short_closeable_amount == 0) and (long_closeable_amount == 0):
# 開1手多倉
order(g.security, 1, side='long')
log.info('沒有持倉,開多倉')
# 當價格向下突破下軌時
elif current_price < g.SellLine:
# 如果當時持有多倉,則先平倉,再開空倉;
if (long_closeable_amount>0):
# 平多倉
order_target(g.security, 0 , side='long')
# 開1手空倉
order(g.security, 1, side='short')
log.info('持有多倉,先平倉,再開空倉')
# 如果沒有持倉,則直接開空倉;
elif (short_closeable_amount == 0) and (long_closeable_amount == 0):
# 開1手空倉
order(g.security, 1, side='short')
log.info('沒有持倉,則直接開空倉')
# 分鐘計數
g.minute_count += 1
## 獲取 BuyLine 和 SellLine
def dual_thrust(security,n,K1,K2):
hist = attribute_history(security, n, '1d', ['high','low','close','open'], df=False)
HH = max(hist['high'])
LC = min(hist['close'])
HC = max(hist['close'])
LL = min(hist['low'])
Open = get_current_data()[security].day_open
# 獲取 Range
Range = max((HH-LC),(HC-LL))
# 計算BuyLine 和 SellLine
BuyLine = Open + K1 * Range
SellLine = Open - K2 * Range
# 返回結果
return BuyLine, SellLine
## 獲取當天時間正在交易的股指期貨合約
def get_stock_index_futrue_code(context,symbol,month='current_month'):
'''
獲取當天時間正在交易的股指期貨合約。其中:
symbol:
'IF' #滬深300指數期貨
'IC' #中證500股指期貨
'IH' #上證50股指期貨
month:
'current_month' #當月
'next_month' #隔月
'next_quarter' #下季
'skip_quarter' #隔季
'''
display_name_dict = {'IF':'滬深300指數期貨','IC':'中證500股指期貨','IH':'上證50股指期貨'}
month_dict = {'current_month':0, 'next_month':1, 'next_quarter':2, 'skip_quarter':3}
display_name = display_name_dict[symbol]
n = month_dict[month]
dt = context.current_dt.date()
a = get_all_securities(types=['futures'], date=dt)
try:
df = a[(a.display_name == display_name) & (a.start_date <= dt) & (a.end_date >= dt)]
if (len(df)>4) and (month in ('next_quarter','skip_quarter')):
return df.index[n+1]
else:
return df.index[n]
except:
return 'WARRING: 無此合約'
# 獲取金融期貨合約到期日
def get_CCFX_end_date(fature_code):
return get_security_info(fature_code).end_date
如有需要
,請加QQ:88652583 或微信: 88652583