去年2023年5月,一篇题为《量化交易平台的坑有多大?由于行情错误1手委托损失400多万!》的知乎帖子在期货量化圈引起了广泛讨论。文中的作者是一名从事无风险套利的交易员,由于期货行情软件推送数据错误,导致频繁撤单高达6万次。由于上期所对高频量化交易的限制,频繁报单撤单超过一定数量后会收取额外费用,最终导致作者在短短半小时内损失了约400万元。
虽然这一损失的主要原因是行情软件的数据错误,但从另一个角度来看,这也暴露了策略风险控制不完善的问题。对于高频策略来说,数据的及时性和交易的迅速性至关重要,因此需要频繁访问API接口或快速进行报撤单操作。然而,交易所通常会对API接口访问频率和报撤单次数设定限制,如果超出这些限制,账户可能会受到约束或面临经济损失。因此,风险控制是除了策略逻辑外不可忽视的关键环节。在此背景下,我们将介绍一个可以统计撤单数量的函数。该函数通过交易所接口获取当日的撤单数量,当撤单数量达到设定的限制时,及时停止策略运行,以防止额外的经济损失。该函数是在优宽量化平台上编写的。
以下是该函数的编写逻辑。首先,我们定义一个变量 statusCount
,初始值为0,然后使用优宽量化的API函数 exchange.IO("status")
检查是否成功连接到交易所。在确认连接成功后,我们使用函数 exchange.GetHistoryOrders()
获取当日所有订单,并遍历这些订单。订单包含许多属性,如合约、开平仓方向、具体订单状态(成功/等待/撤单)等。我们主要关注订单的 Status
属性,当 Status
为ORDER_STATE_CANCELED
时,表示订单已撤销(ORDER_STATE_PENDING
:未完成;ORDER_STATE_CLOSED
: 已完成;ORDER_STATE_UNKNOWN
: 未知状态)。我们通过统计 Status == ORDER_STATE_CANCELED
的订单数量来获取撤单次数,并返回结果。
在策略主函数中,可以直接调用 countCancelOrders
函数来获取撤单数量,并根据撤单数量进行限制和风险控制。根据中国各大期货交易所规定,“客户单日在某一合约上的撤单次数超过500次(含500次),构成‘日内出现频繁申报并撤销申报,可能影响期货交易价格或误导其他客户进行期货交易的行为’,将会受到警告或者限制开仓等措施”,因此我们设置如果检测到撤单数量达到480次以上(保有余量),我们可以使用优宽量化通知函数,并使用throw
及时停止策略。这种方法可以在策略运行的同时,实时监控撤单数量,从而有效地防止因超额撤单带来的额外经济损失。
function countCancelOrders() {
let statusCount = 0; // 撤单数量
if (exchange.IO("status")) {
let orders = exchange.GetHistoryOrders();
if (!orders) return 0; // Return 0 if no orders are returned
for (let order of orders) {
if (order.Status === ORDER_STATE_CANCELED) { // Use strict equality (===)
statusCount++;
}
}
return statusCount;
} else {
return '获取撤单数量失败';
}
}
function main() {
while(true){
let cancelNumber = countCancelOrders();
if(cancelNumber >= 480){
Log('策略风险:当日撤单数量已达480次以上,已停止策略#ff0000', "@")
throw '策略运行错误,请检查策略逻辑#00ff00'
}
Sleep(1000)
}
}
并且呢,我们也可以设置包括优宽APP,邮箱和钉钉的通知,这样可以帮助我们及时获取到策略运行的风险,省去人工盯盘的烦恼。通过引入这样的风险控制函数,我们可以有效地避免在高频交易中因撤单过多而导致的巨大经济损失,挽救可能高达数百万元的潜在损失。
虽然本文纯蹭热点(还是去年的!),但是欢迎大家来到优宽量化进行更多量化交易的探索。优宽量化是一家深耕金融量化交易的公司,专注于商品期货和期权的量化交易,这里有丰富的学习资源,海量的历史数据,方便的API函数,免费的回测平台,致力于帮助用户降低开发壁垒,构建属于自己的量化系统。欢迎大家加入我们,一起过来玩耍。
转载自:优宽量化交易平台社区
作者:ianzeng123