zoukankan      html  css  js  c++  java
  • CC高频策略经验分享

    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+"&timestamp="+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 updateTrades(){//获取最近成交
        trades = exchange.IO("api", "GET","/fapi/v1/trades","limit=200&timestamp="+Date.now()+"&symbol="+Symbol+"USDT")
    }
    function updateDepth(){//获取深度
        depth = exchange.IO("IO", "api", "GET","/fapi/v1/depth","timestamp="+Date.now()+"&symbol="+Symbol+"USDT")
    }
    
    function onTick(){
        updateDepth() 
        updateTrades() 
        updatePosition() 
        makeOrder() //计算下单价格、数量并下单
        updateStatus() //更新状态信息
    }
    
    //主循环,休眠时间100ms,策略的循环延时通常在在30ms以内。
    function main() {
        while(true){
            if(Date.now() - update_loop_time > 100){
                onTick()
                update_loop_time = Date.now()
            }
            Sleep(1)
        }
    }
    

     

  • 相关阅读:
    包导入基础知识
    怎么创建模块?
    reload基础
    重载模块概念及意义
    导入和作用域 #596
    属性名的点号运算
    模块命名空间
    from会存在潜在的陷阱
    如何通过from语句调用模块的变量名?
    如何调用模块的变量名?
  • 原文地址:https://www.cnblogs.com/dhcn/p/14849620.html
Copyright © 2011-2022 走看看