关于程序化交易系统的设计思路

出于各方面考虑,重新捡起半年前的程序,并有了很多新的发现,我相信会迎来一个好的机会。出于可以理解的原因,这篇分享暂时不会提及太多细节,使用市场、交易品种等字眼,请理解。

一、先说风险

1、通过程序化套利,减少乃至消除人的主观判断带来的影响和判断,但是必须正视风险的存在

(1)客观风险:一级市场的欺诈,也就是交易品种本身的价值风险,极端情况会产生归零的局面

应对方式:筛选交易品种,尤其是只在国内背景交易所发行、团队为国内背景的品种,严格禁止交易;分散运作;

(2)主观风险:交易价格产生与个人判断不一致的情况,这种情况就是程序化交易存在的原因,降低个人判断的影响。

(3)技术风险:滑点、价格变动造成的单边交易;滑点通过限价交易进行避免;单边交易本身无法避免;

2、单边交易的处理:

(1)通过观察交易品种,尽量选择时间不敏感的品种,但是无法绝对避免;

(2)最重要的是,可以分析进入机会,假定与成本价格偏差太大,此时产生的单边交易可能会造成严重的后果,因此要根据成本偏差,决定是否进入市场交易。

二、设计思路

1、单边交易的具体处理:

当卖出价格低于成本价格过多时,蕴藏着巨大风险,体现在:

(1)如卖出成功,而买入未成功(挂单),相当于在高位买入、低位卖出,造成直接损失;

(2)因此时价格较低,大盘反弹力量增强,后继的趋势以增长可能性居多,也就是说挂的买入单更有可能无法成交(价格在上涨),程序停滞;

反之,当卖出价格处于高位,高于成本价格时,单边交易造成的风险要小的多:

(1)相当于低位买入、高位卖出,有获利无损失;

(2)价格处于高位,下跌力量增强,挂的买单成交可能性大;

因此,需要牺牲一部分交易机会,来换取交易的安全性。


2、H market 和 B market的交易指令

H market

(1)所有的order,只要完成,注意不是成功,一律只返回{u'status': u'ok', u'data': u'5672797941’} data域内为订单号

(2)order 分为 limit,market,IOC,ioc=fak  fill and killed,也就是立即成交,没有成交的部分取消,但是实际查询时,仍然可能出现submitted的中间状态

(3)需要主动查询order状态

{u'status': u'ok', u'data': {u'account-id': 848426, u'canceled-at': 0, u'finished-at': 1529036635436, u'field-cash-amount': u'0.006722000000000000', u'price': u'0.003300000000000000', u'created-at': 1529036635094, u'state': u'filled', u'id': 5897577214, u'field-amount': u'2.000000000000000000', u'amount': u'2.000000000000000000', u'source': u'api', u'field-fees': u'0.000013444000000000', u'type': u'sell-ioc', u'symbol': u'steemeth’}}

[data][state]反应该order的当前状态,filled为完成,submitted为提交,canceled为取消,part-filled(不确定)为部分成交;

 B market

(1)order后,完成返回

{u'orderId': 7574719, u'clientOrderId': u'ApVcQ9Qk50lTnLRmtmpj4O', u'origQty': u'5.00000000', u'symbol': u'STEEMETH', u'side': u'BUY', u'timeInForce': u'GTC', u'status': u'NEW', u'transactTime': 1528777792169, u'type': u'LIMIT', u'price': u'0.00329600', u'executedQty': u'0.00000000’}

[status] NEW代表挂单,FILLED成交

(2)order分为 FOK fill or killed 要么全部成交要么取消,GTC,market

(3)查询的结果:

{u'orderId': 7574719, u'clientOrderId': u'ApVcQ9Qk50lTnLRmtmpj4O', u'origQty': u'5.00000000', u'icebergQty': u'0.00000000', u'symbol': u'STEEMETH', u'side': u'BUY', u'timeInForce': u'GTC', u'status': u'NEW', u'stopPrice': u'0.00000000', u'time': 1528777792169, u'isWorking': True, u'type': u'LIMIT', u'price': u'0.00329600', u'executedQty': u'0.00000000’}



三、程序实现

1、keep eyes on:主程序外,跑一个监测程序,分析有潜力的交易品种,进入潜在的交易类目;

2、由于是限价交易:不必考虑滑点问题,但需要保持代码对时间的敏感性(分秒必争);

3、有效率的打log,看起来不重要,但是每天看到1个100多Mlog日志的心情如何,更别提从中找出有价值的信息了,可以在价格发生变动时再打;

4、设置程序心跳,这个很有必要


四、小结

1、作为一个套利程序,本身并不复杂,最重要的应该是交易品种的选择,以及单边交易的处理;

猜你喜欢

转载自blog.csdn.net/frankxixu/article/details/80689086