极星的极智量化是一个很不错的量化工具,基于python,又有比较全面的API可以直接调用。今天分享一个实现用A_SendOrder 来实现开仓和平仓,并分享一个可以避免重复开单的小技巧。
g_params['ContractId'] = 'ZCE|F|SR|201'
def initialize(context):
# 订阅信息
SetBarInterval(g_params['ContractId'], Enum_Period_Min(), g_params['mint'] , g_params['numb'])
def handle_data(context):
global 开仓时间
buy_lots_0 = A_BuyPosition(g_params['ContractId'])
if buy_lots_0 == 0 and (time.time()-开仓时间 > 50) :
A_SendOrder(Enum_Buy(),Enum_Entry(),g_params['acc_lots'],Q_BidPrice(g_params['ContractId']),g_params['ContractId'],g_params['acc_nub'],'1')
开仓时间 = time.time()
pf_b_0 = A_BuyProfitLoss(g_params['ContractId'])
if pf_buy_sum > g_params['pfclose']:
A_SendOrder(Enum_Sell(),Enum_Exit(),A_BuyPosition(g_params['ContractId']),Q_AskPrice(g_params['ContractId']),g_params['ContractId'],g_params['acc_nub'],'1')
这段代码 是从整个逻辑里 复制出来的,可能复制的过程中有一些格式上的错误,大家自己校正。
- 利用A_SendOrder 函数来做买单入场单,成交之后 在平仓的时候,用“卖平” 的形式来出场。而不是常识意义上的 “平买”;往往是使用平仓模式不正确,导致的不能顺利平仓。提醒的就是,没有对应仓量
- 用“开仓时间”这个全局变量进行限定交易的时间。
- 在成交的时候,给这个变量赋值
- 再次判断是否要进单子的时候,一定要判断当前的时间和这个上次入场的时间是否有足够的时间间隔。
入场的时候之所以会频繁入场,多半是因为一秒内 其实已经发送了订单,但是订单处于委托状态并没有成交,返回的数据就是持仓是0,同样符合入场条件,导致了频繁发送订单。
如果能 在发送的时候就记录了这个时间,给订单的成交一个时间缓冲,就能有效的规避这个问题。
当然,还有其他的办法:等K线稳定后再次成交;但是用对冲思路,这个办法就不好了,价格瞬间变化太快,等稳定了K线,黄花菜都凉了。还可以获取委托单的成交状态,如果订单处于排队的状态,就停止继续发送订单。这样也是可以的。后面再进行补充