- # coding:gbk
- class _a():
- pass
- A = _a()
- def init(C):
- # print("2122231232132324")
- A.symbol = "c2401.DF" # 填一个具体合约,跑不起来大概率就是你没有下载本地数据
- A.period = "1m"
- C.accID = "123123"
- return
-
- def handlebar(C):
- # print(C.barpos)
- backTestTime = timetag_to_datetime(C.get_bar_timetag(C.barpos),"%Y%m%d%H%M%S")
- print(backTestTime)
- kline = C.get_market_data_ex(['open', 'high','low','close'],[A.symbol],period = A.period, end_time = backTestTime)[A.symbol]
- # print(123)
- # print(kline)
- ma5 = kline["close"].rolling(5).mean()
- ma10 = kline["close"].rolling(10).mean()
- holding = get_Future_holdings(C.accID)
- lots = holding.get(A.symbol,{}).get("净持仓",0)
- print(f"已走完K线 --- ma5:{ma5.iloc[-2]} ma10:{ma10.iloc[-2]}" )
- print(f"最新K线 --- ma5:{ma5.iloc[-1]} ma10:{ma10.iloc[-1]}" )
- # print(ma5.iloc[-2] > ma10.iloc[-2] )
- if ma5.iloc[-2] > ma10.iloc[-2] and ma5.iloc[-3] < ma10.iloc[-3]:
- print(f"ma5上穿ma10")
- if lots < 0:
- my_passorder(C,A.symbol, "buy_close", abs(lots))
-
- my_passorder(C,A.symbol, "buy_open",1)
- elif ma5.iloc[-2] < ma10.iloc[-2] and ma5.iloc[-3] > ma10.iloc[-3]:
- print(f"ma5下穿ma10")
- if lots > 0:
- my_passorder(C,A.symbol, "sell_close", lots)
-
- my_passorder(C,A.symbol, "sell_open",1)
-
- # .get market data ex(['open', 'high','low','close'],['510300.SH']
- return
- def my_passorder(C,Futuer:str,opentype:str,lots:int,price = None,m_strRemark = '系统备注'):
- '''
-
- Args:
- C: ContextInfo \n
- Futuer: 期货代码 \n
- opentype:
- 'buy_open' 开多\n
- 'sell_open' 开空\n
- 'sell_close' 平多\n
- 'buy_close' 平空\n
- lots: 手
- price: 下单价格,不指定时默认按市价下单
- m_strRemark = '系统备注' 用于自定义寻找orderID
- '''
- Futuer_ExchangeID = Futuer.split(".")[1]
- opentype = opentype #买卖方向
- op =1101 #手数
- # 期货区分开平
- if opentype == "buy_open":
- opType = 0
- elif opentype == "sell_open":
- opType = 3
- elif opentype == "sell_close":
- opType = 7
- elif opentype == "buy_close":
- opType = 9
- volumex = lots
- price = 0 if not price else price # price参数必须存在
- if Futuer_ExchangeID == "SF":
- prType = 14 if not price else 11 # 对于上期所,若不指定价格,则默认按对手价下单
- elif Futuer_ExchangeID == "DF" or Futuer_ExchangeID == "ZF":
- prType = 12 if not price else 11 # 对于大商所和郑商所,若不指定价格,则默认按涨跌停价下单
- else:
- prType = 14 if not price else 11 # 对于其他所,若不指定价格,则默认按对手价下单
- print(f'{Futuer} 新委托信息 方向{opentype} 价格{price} 量{volumex}')
- #print(f"opType:{opType} , op:{op} , C.accID{C.accID} , stock{stock} , prType{prType} , price{price} , volumex{volumex}")
- passorder(opType, op, C.accID,Futuer, prType, price, volumex,'交易注释',1,'{}'.format(m_strRemark), C)
- print(f'委托发送完成')
- def get_Future_holdings(accid,symbol = None):
- '''
- 针对期货返回持仓的奇葩结构做处理
- Arg:
- accondid:账户id
- symbol: 品种,不填默认返会全部持仓
-
- return:
- {股票名:{'手数':int,"持仓成本":float,'浮动盈亏':float,"可用余额":int}}
- '''
- datatype = "FUTURE"
-
- PositionInfo_dict = {}
-
- Long_dict={}
-
- Short_dict={}
-
- resultlist = get_trade_detail_data(accid,datatype,'POSITION')
-
- for obj in resultlist:
- #防除零
- if obj.m_nVolume == 0:
- continue
- if obj.m_nDirection == 48:
- if not Long_dict.get(obj.m_strInstrumentID+"."+obj.m_strExchangeID):
- Long_dict[obj.m_strInstrumentID+"."+obj.m_strExchangeID] = {
- "多头数量":obj.m_nVolume,
- "多头成本":obj.m_dOpenPrice,
-
- "浮动盈亏":obj.m_dFloatProfit,
- "保证金占用":obj.m_dMargin
- }
- else:
-
- Long_dict[obj.m_strInstrumentID+"."+obj.m_strExchangeID]["多头数量"] += obj.m_nVolume
- # 算浮动盈亏
- Long_dict[obj.m_strInstrumentID+"."+obj.m_strExchangeID]["浮动盈亏"] += obj.m_dFloatProfit
- # 算保证金占用
- Long_dict[obj.m_strInstrumentID+"."+obj.m_strExchangeID]["保证金占用"] += obj.m_dMargin
- # 算多头成本
- Long_dict[obj.m_strInstrumentID+"."+obj.m_strExchangeID]["多头成本"] = (
- Long_dict[obj.m_strInstrumentID+"."+obj.m_strExchangeID]["多头成本"] * \
- (Long_dict[obj.m_strInstrumentID+"."+obj.m_strExchangeID]["多头数量"] - obj.m_nVolume) + \
- (obj.m_dOpenPrice * obj.m_nVolume)
- )/Long_dict[obj.m_strInstrumentID+"."+obj.m_strExchangeID]["多头数量"]
-
- elif obj.m_nDirection == 49:
- if not Short_dict.get(obj.m_strInstrumentID+"."+obj.m_strExchangeID):
- Short_dict[obj.m_strInstrumentID+"."+obj.m_strExchangeID] = {
- "空头数量":obj.m_nVolume ,
- "空头成本":obj.m_dOpenPrice ,
- "浮动盈亏":obj.m_dFloatProfit,
- "保证金占用":obj.m_dMargin
- }
- else:
- Short_dict[obj.m_strInstrumentID+"."+obj.m_strExchangeID]["空头数量"] += obj.m_nVolume
- # 算浮动盈亏
- Short_dict[obj.m_strInstrumentID+"."+obj.m_strExchangeID]["浮动盈亏"] += obj.m_dFloatProfit
- # 算保证金占用
- Short_dict[obj.m_strInstrumentID+"."+obj.m_strExchangeID]["保证金占用"] += obj.m_dMargin
- # 计算空头成本
- Short_dict[obj.m_strInstrumentID+"."+obj.m_strExchangeID]["空头成本"] = (
- Short_dict[obj.m_strInstrumentID+"."+obj.m_strExchangeID]["空头成本"] * \
- (Short_dict[obj.m_strInstrumentID+"."+obj.m_strExchangeID]["空头数量"] - obj.m_nVolume) + \
- (obj.m_dOpenPrice * obj.m_nVolume)
- )/Short_dict[obj.m_strInstrumentID+"."+obj.m_strExchangeID]["空头数量"]
-
-
- for _symbol in set(list(Long_dict.keys()) + list(Short_dict.keys())):
-
- PositionInfo_dict[_symbol] = {
- "多头数量":Long_dict[_symbol]["多头数量"] if Long_dict.get(_symbol) else 0 ,
-
- "空头数量":Short_dict[_symbol]["空头数量"] if Short_dict.get(_symbol) else 0 ,
-
- "多头成本":Long_dict[_symbol]["多头成本"] if Long_dict.get(_symbol) else None ,
-
- "空头成本":Short_dict[_symbol]["空头成本"] if Short_dict.get(_symbol) else None,
-
- "净持仓" : Long_dict.get(_symbol,{}).get("多头数量",0) - Short_dict.get(_symbol,{}).get("空头数量",0),
-
- "浮动盈亏": Long_dict.get(_symbol,{}).get("浮动盈亏",0) + Short_dict.get(_symbol,{}).get("浮动盈亏",0),
-
- "保证金占用": Long_dict.get(_symbol,{}).get("保证金占用",0) + Short_dict.get(_symbol,{}).get("保证金占用",0)
- }
-
- if symbol:
- return PositionInfo_dict[symbol]
- else :
- return PositionInfo_dict
复制代码
|