'''
1,、首先計(jì)算:
(1)N日High的最高價(jià)HH, N日Close的最低價(jià)LC;
(2)N日Close的最高價(jià)HC,N日Low的最低價(jià)LL;
(3)Range = Max(HH-LC,HC-LL)
(4)BuyLine = Open + K1*Range
(5)SellLine = Open + K2*Range
2.構(gòu)造系統(tǒng)
(1)當(dāng)價(jià)格向上突破上軌時(shí),,如果當(dāng)時(shí)持有空倉,則先平倉,,再開多倉,;如果沒有持倉,則直接開多倉,;
(2)當(dāng)價(jià)格向下突破下軌時(shí),,如果當(dāng)時(shí)持有多倉,則先平倉,,再開空倉,;如果沒有持倉,則直接開空倉,;
'''
def initialize(context):
# 設(shè)定滬深300作為基準(zhǔn)
set_benchmark('000300.XSHG')
# True為開啟動(dòng)態(tài)復(fù)權(quán)模式,,使用真實(shí)價(jià)格交易
set_option('use_real_price', True)
# 設(shè)定成交量比例
set_option('order_volume_ratio', 1)
# 關(guān)閉訂單提醒
# log.set_level('order', 'error')
# 設(shè)定期貨保證金比例
set_option('futures_margin_rate', 0.3)
# 設(shè)定操作金融期貨
set_subportfolios([SubPortfolioConfig(cash=context.portfolio.cash, type='index_futures')])
# 金融期貨close_today_commission可不用設(shè)定,平今倉默認(rèn)0.0023
set_order_cost(OrderCost(open_commission=0.000023, close_commission=0.000023, close_today_commission=0.0023), type='index_futures')
#運(yùn)行函數(shù)
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):
# 分鐘計(jì)數(shù)
g.minute_count = 0
def trade(context):
# 開盤第一分鐘
if g.minute_count == 0:
# 獲取當(dāng)月可交易的 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)
# 分鐘計(jì)數(shù)
g.minute_count += 1
# 開盤第一分鐘之后
else:
# 獲取標(biāo)的可平多倉
long_closeable_amount = context.portfolio.long_positions[g.security].closeable_amount
# 獲取標(biāo)的可平空倉
short_closeable_amount = context.portfolio.short_positions[g.security].closeable_amount
# 獲取標(biāo)的的最新價(jià)
current_price = attribute_history(g.security, 1, '1m', ['close'], df=False)['close'][0]
# 當(dāng)價(jià)格向上突破上軌時(shí)
if current_price > g.BuyLine:
# 如果當(dāng)時(shí)持有空倉,,則先平倉,,再開多倉;
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('沒有持倉,,開多倉')
# 當(dāng)價(jià)格向下突破下軌時(shí)
elif current_price < g.SellLine:
# 如果當(dāng)時(shí)持有多倉,則先平倉,,再開空倉,;
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('沒有持倉,,則直接開空倉')
# 分鐘計(jì)數(shù)
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))
# 計(jì)算BuyLine 和 SellLine
BuyLine = Open + K1 * Range
SellLine = Open - K2 * Range
# 返回結(jié)果
return BuyLine, SellLine
## 獲取當(dāng)天時(shí)間正在交易的股指期貨合約
def get_stock_index_futrue_code(context,symbol,month='current_month'):
'''
獲取當(dāng)天時(shí)間正在交易的股指期貨合約,。其中:
symbol:
'IF' #滬深300指數(shù)期貨
'IC' #中證500股指期貨
'IH' #上證50股指期貨
month:
'current_month' #當(dāng)月
'next_month' #隔月
'next_quarter' #下季
'skip_quarter' #隔季
'''
display_name_dict = {'IF':'滬深300指數(shù)期貨','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