https://zhuanlan.zhihu.com/p/321315337
我的经历:
大概两天时间写好了策略,经过1天的调整,23号在币安永续合约正式开始运行。收益率排名如下。由于统计有问题,实际上的排名应该更高。
一点经验:
并不是所有的市场和时间都适合高频策略,要运行高频机器人的条件很苛刻。下面是几点条件。
1.适合高频的市场
这5天只在币安交易FIL永续合约,FIL刚上线市场十分混乱,永续价格和现货的差价一度到了30%以上,导致多空在FIL分歧十分严重,16号开盘价从60一路跌到26开始反弹,又一度跌倒19反弹到37。交易额高的几天排名所有交易对第三,仅次于老牌的BTC和ETH,这是高频交易的黄金机会。遗憾的是我没有第一时间准备好机器人,错过了开始的几天,但还好赶上24-25号的行情,大部分收益来自于此时间段。27号过后,差价逐渐减小,顶格的资金费率也没有了,成交量萎缩,策略赚钱难度变大。
类似的机会还有SUSHI/YFI/YFII/UNI上线之初的一段时间,波动性和交易量都很大,print(money)也是抓住了这些机会。在这些币无法继续赚钱的时候,FIL又出现了。这两波一次是炒的火热的DEFI概念,一个是备受瞩目的FIL,在现在的情况下,下一次的机会也需要等很久。
2.交易费率
高频策略对手续费十分敏感,币安maker返十万分之2的门槛并不高,虽然返费很少,但是可以理解为免手续费,一批在古老的现货无手续费时代的高频策略得以复活。当然在行情波动剧烈时,手续费相对没有那么重要。
3.频率高
高频机器人最有名的特点就是频率极高,在行情变化快时,我的策略很多都是在100ms内完成开平仓。
4.策略的胜率
高频策略需要对行情的短期趋势做出准确的判断,并且在胜率越高下单量越大,短时间交易量越大下单量越大。FIL由于交易量很大,交易频繁,所以几秒内的趋势预测准确率很高。同样多空博弈剧烈,给了maker建立相应仓位和平仓的机会。这一点和早期的现货高频不同,现在maker有返佣,但taker还是有很高的手续费,因此只能挂单。想象一下,如果所有人都短时间看多,高频策略由于吃单手续费,maker买单无法成交,也就无法获利,而如果市场完全没有的趋势,maker订单能成交但获利的概率不高。所以当前的高频策略即要求市场有大趋势保证高胜率,又要有局部的多空分歧保证能大量成交。
行情顺利时,我的策略的胜率在80%以上,盈亏比大于1,当市场没有明显趋势,长期胜率也在65%以上,盈亏比低于1 。
5.高频策略的容量
高频策略的容量显然是不高的,由于永续的高杠杆,100u也能操作2000u以上的资金,所以高频策略能以很小的资金起步。但整体的获利净额并不会太大。具体的容量要看市场上的成交量。
6.策略的风险
有开仓就有风险,但高频的优势在于交易次数很高,一次亏损还可以迅速的再交易10次把亏损补回来,拉长周期看回撤很小。持仓越大风险越大,所以不能无限制的增加持仓,要有一定的负反馈机制,仓位多了就增加平仓减少开仓,保证有持仓的时间短。有持仓是如果正好逆势,会有很大的亏损,所以策略设计了对方向的判断,保证了大暴涨或大暴跌时站在趋势的一侧开仓,进一步价降低了风险,代价是短期趋势不明朗会频繁亏小钱。
关于我的策略
策略原理:
获取最近成交trades、深度depth和当前仓位,根据trades判断趋势,根据成交量决定开仓大小,判断趋势为上涨就挂单开多,同时平多头,如果此时持有空头仓位就先全部平掉。判断趋势下跌操作同理。
高频策略的思想都是很一致的,我本次的策略吸取了我以前公开的2014年的高频策略以及OKCoin韭菜收割机策略的思路。这两个策略在FMZ都能找到源码,如果把这两个策略都吃的很透,高频交易将对你没有秘密。
策略架构:
策略使用异步架构(参考FMZ社区进阶教程),这里没有源码只是简单用到函数的说明,并不是可运行的完整的代码,也没有涉及到核心逻辑。API全部使用REST协议,并没有用websocket。服务器在东京,可以获得更低的延时。语言使用JavaScript,实际上高频策略竞争也没到很激烈的程度,Js的V8引擎性能强大,对于新手也更友好,并不需要C++。
//设置交易对与杠杆
var pair = Symbol+'USDT'
exchange.SetCurrency(Symbol+'_USDT')
exchange.SetContractType("swap")
exchange.IO("api", "POST", "/fapi/v1/leverage", "symbol="+pair+"&leverage="+5+"×tamp="+Date.now())
//基本的交易精度限制
var price_precision = null
var tick_size = null
var amount_precision = null
var min_qty = null
var exchange_info = JSON.parse(HttpQuery('https://fapi.binance.com/fapi/v1/exchangeInfo'))
for (var i=0; i<exchange_info.symbols.length; i++){
if(exchange_info.symbols[i].baseAsset == Symbol){
tick_size = parseFloat(exchange_info.symbols[i].filters[0].tickSize)
price_precision = exchange_info.symbols[i].filters[0].tickSize.length > 2 ? exchange_info.symbols[i].filters[0].tickSize.length-2 : 0
amount_precision = exchange_info.symbols[i].filters[1].stepSize.length > 2 ? exchange_info.symbols[i].filters[1].stepSize.length-2 : 0
min_qty = parseFloat(exchange_info.symbols[i].filters[1].minQty)
}
}
function updatePosition(){//获取持仓,Symbol为交易对,加入交易对参数而不是返回全币种可以减少一次API占用
position = exchange.IO("api", "GET","/fapi/v2/positionRisk","timestamp="+Date.now()+"&symbol="+Symbol+"USDT")
}
function