python怎么实现委托策略
本篇内容介绍了"python怎么实现委托策略"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
策略思路
同样使用委托一个订单后,自动生成止损、止盈、反手委托任务的机制,只不过第一个委托订单,按照1分钟级别均线和当前价格的偏离程度来作为触发条件,做回归策略,收盘前平仓。策略并不复杂。
策略实现细节
策略轮询逻辑中的数据准备
// 获取行情exchange.SetContractType(_EntrustSymbol) // 设置合约例如设置参数_EntrustSymbol为rb2001var ticker = _C(exchange.GetTicker) // 获取tick数据var records = _C(exchange.GetRecords) // 获取K线数据,设置K线周期为1分钟,这里获取的就是1分钟周期K线数据$.PlotRecords(records, "K") // 画图,画出K线var nowTs = new Date().getTime() // 获取当前时间,时间戳。
获取这些数据用于之后的计算。
需要计算每天早上开盘后的均线,首先要判断出当前以日为单位,开盘时第一根K线的时间戳:
for (var j = records.length - 1; j > -1; j--) { var ts = records[j].Time if (ts % (1000 * 60 * 60 * 24) == 3600000) { // 60 * 60 * 1000 = 3600000 if (oneDayBeginTS != ts) { oneDayBeginTS = ts Log("新的一天开始!") // 清空任务队列 IsEntrust = false // 设置的一个全局变量标记,用来标记当前是不是已经触发委托,这里是在新的一天开始时重置 } break }}
这段代码,就是倒序遍历K线数据,判断第一个符合ts % (1000 * 60 * 60 * 24) == 3600000的K线BAR,ts为K线的时间戳,ts和1000 * 60 * 60 * 24求余,得出一天中,已经渡过了多少毫秒。当这个数值等于3600000时即判断为新的开盘时间开始,因为是早晨9:00开盘,60 * 60 * 1000 = 3600000当时间渡过了3600000毫秒(1小时)时,正好是北京时间9:00。从而拿到每天开盘的第一根K线Bar的时间戳:oneDayBeginTS = ts
然后计算均线:
var sum = 0var count = 0var avg = 0for (var n = 0 ; n < records.length; n++) { if (records[n].Time >= oneDayBeginTS) { sum += records[n].Close count++ if (n == records.length - 1) { avg = sum / count $.PlotLine("avg", avg, records[n].Time) # 画出均线 } }}
计算ATR
使用5日ATR指标作为偏离程度的参照,首先计算ATR:
var records_Day = _C(exchange.GetRecords, PERIOD_D1) // 获取日K线if (records_Day.length <= 5) { // K线数量必须满足ATR周期,否则直接返回。 LogStatus("收集K线") Sleep(2000) return }var atr = TA.ATR(records_Day, 5) // 计算ATR指标var _Dis = atr[atr.length - 2] * 0.5 // 获取前一BAR的ATR指标值,可以乘以一个系数作为调整
收盘前平仓
if (nowTs + 1000 * 60 > oneDayBeginTS + 1000 * 60 * 60 * 6) { p.CoverAll() _TaskQueue = []}
oneDayBeginTS + 1000 * 60 * 60 * 6
9:00开盘时间往后推移6小时,即15:00,nowTs + 1000 * 60
即提前一分钟时间,当nowTs + 1000 * 60 > oneDayBeginTS + 1000 * 60 * 60 * 6
条件成立,即距离收盘的时间已经小于1分钟了,开始执行平仓。得意于「商品期货交易类库」的强大功能,直接调用全平函数p.CoverAll()
,即可全部平仓。商品期货交易类库不熟悉的可以看下这个类库代码,代码是开源的。
触发委托条件
if (Math.abs(records[records.length - 1].Close - avg) > _Dis && !IsEntrust) { var task = { taskType : ENTRUST, taskSymbol : _EntrustSymbol, taskPrice : records[records.length - 1].Close, taskAmount : _EntrustAmount, taskDirection : records[records.length - 1].Close - avg > 0 ? "sell" : "buy", taskTrigger : records[records.length - 1].Close - avg > 0 ? 1 : -1, // 大于触发 taskFinished : false } Log("请注意,创建委托任务", task, "#FF0000") _TaskQueue.push(task) IsEntrust = true}
由条件Math.abs(records[records.length - 1].Close - avg) > _Dis && !IsEntrust
作为触发条件,只要当前的收盘价减去均线当前数值的绝对值大于_Dis
这个浮动的触发距离,就创建委托任务。
该委托任务如果触发执行,会和上篇文章一样,自动创建一些列的止盈、止损、反手任务。
"python怎么实现委托策略"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!