Loading ...

3.2 模板:数字货币交易类库 (集成 现货、 期货支持OKCoin期货/BitVC)

Author: 小小梦, Created: 2017-01-04 19:00:10, Updated: 2017-10-11 10:27:01

3.2 模板:数字货币交易类库 (集成 现货、 期货支持OKCoin期货/BitVC)


3.1 章节展现了一个现货的交易模板,大大简化了编写现货策略的难度。但是期货的交易处理与现货有很大不同,所以在现货模板的基础上集成了期货交易功能,现已公开。

img

已经公开在策略广场:

img

  • 现货:

    现货方面和之前的 《数字货币现货交易类库》一样。

  • 期货:

    参数: img

    img

    策略自带的测试代码:

    function main() {
      if (exchange.GetName() === 'Futures_OKCoin') {
          var info = exchange.SetContractType("this_week");
          Log("info 返回值:", info);
          Log("当前持仓信息", exchange.GetPosition(), _C(exchange.GetTicker));
          var depth = exchange.GetDepth();
          var p = $.NewPositionManager();
          p.OpenShort("this_week", 10, depth.Bids[0].Price - 2);
          Log(exchange.GetPosition());
          Sleep(500 * 1000);
          depth = exchange.GetDepth();
          var ret = p.Cover("this_week", depth.Bids[0].Price + 2, 5);
          Log("cover ret:", ret);
          //LogProfit(p.Profit());
          Log(exchange.GetPosition());
          Log("-----------------------------测试分割线----------------------------------------");
          var depth = exchange.GetDepth();
          p.OpenLong("this_week", 20, depth.Bids[0].Price + 2);
          Log(exchange.GetPosition());
          Sleep(500 * 1000);
          depth = exchange.GetDepth();
          var ret = p.Cover("this_week", depth.Bids[0].Price - 2, 10, PD_LONG);
          Log("cover ret:", ret);
          Log(exchange.GetPosition());
          Log("-----------------------------测试分割线----------------------------------------");
          var ret = p.Cover("this_week", depth.Bids[0].Price - 3, 10, PD_LONG);
          Log("cover ret:", ret);
          var ret = p.Cover("this_week", depth.Bids[0].Price + 3, 5, PD_SHORT);
          Log("cover ret:", ret);
          Log(exchange.GetPosition());
      } else if (exchange.GetName() === 'Futures_BitVC') {
          var info = exchange.SetContractType("week");
          Log("info 返回值:", info);
          Log("当前持仓信息", exchange.GetPosition(), _C(exchange.GetTicker));
          var depth = exchange.GetDepth();
          var p = $.NewPositionManager();
          p.OpenLong("week", 500, depth.Bids[0].Price + 2);
          Log(exchange.GetPosition());
          Sleep(500 * 1000);
          depth = exchange.GetDepth();
          var ret = p.Cover("week", depth.Bids[0].Price - 2, 500);
          Log("cover ret:", ret);
          Log(exchange.GetPosition());
          Log("-----------------------------测试分割线----------------------------------------");
          var info = exchange.SetContractType("week");
          Log("info 返回值:", info);
          Log("当前持仓信息", exchange.GetPosition(), _C(exchange.GetTicker));
          var depth = exchange.GetDepth();
          p.OpenShort("week", 600, depth.Bids[0].Price - 2);
          Log(exchange.GetPosition());
          Sleep(500 * 1000);
          depth = exchange.GetDepth();
          var ret = p.Cover("week", depth.Bids[0].Price - 2, 500, PD_SHORT);
          Log("cover ret:", ret);
          Log(exchange.GetPosition());
          Log("-----------------------------测试分割线----------------------------------------");
          var ret = p.Cover("week", depth.Bids[0].Price + 3, 100, PD_SHORT);
          Log("cover ret:", ret);
          //p.Cover("week", depth.Asks[0].Price - 3, 300, PD_LONG);
          Log(exchange.GetPosition());
      } else if(exchange.GetName() === 'huobi' || exchange.GetName() === 'OKCoin'){
          Log($.GetAccount());
          Log($.Buy(0.5));
          Log($.Sell(0.5));
          exchange.Buy(1000, 3);
          $.CancelPendingOrders(exchanges[0]);
          Log($.Cross(30, 7));
          Log($.Cross([1,2,3,2.8,3.5], [3,1.9,2,5,0.6]));
      }
    }
    

    使用: img

在策略中的测试代码(选择引用模板)

img

测试策略:

function main(){
    var p = $.NewPositionManager();
    var i = 0;
    exchanges[0].SetContractType("this_week");
    var isFirst = true;
    var ret = null;
    while(true){
        var depth = _C(exchanges[0].GetDepth);
        var positions = _C(exchanges[0].GetPosition);
        var len = positions.length;
        if(isFirst === true && i % 3 === 0 && len === 0){
            ret = p.OpenLong("this_week", 1 + (i % 3) + (i % 2), depth.Asks[0].Price);
            isFirst = false;
        }else if(isFirst === false){
            ret = p.OpenShort("this_week", 1 + (i % 3) + (i % 2), depth.Bids[0].Price);
            isFirst = true;
        }else{
            for(var j = 0 ; j < len; j++){
                if(positions[j].Type === PD_LONG){
                    ret = p.Cover("this_week", depth.Bids[0].Price - 2, positions[j].Amount, PD_LONG);
                }else if(positions[j].Type === PD_SHORT){
                    ret = p.Cover("this_week", depth.Asks[0].Price + 2, positions[j].Amount, PD_SHORT);    
                }
                Log("ret:", ret);
            }
        }
        Log("ret", ret, "---------------------#FF0000");
        i++;
        Sleep(1000 * 60 * 15);
    }
}

如有问题、BUG,欢迎联系作者,十分感谢!


More

wildfire 梦总,OKex期货下单的时候,会出现重复下单的情况:比如你要买10手,最后可能成交了20手,出现了好几次了,在价格剧烈变化的时候。

outlawjk python版本的也支持okex期货吗?

simple-chun 请问ret 代表什么呀?是什么英文词组的简写呀? RECOVER T?

simple-chun 请问PY版的在哪呀?

yhfgg 习惯用python,有python版本吗

小小梦 是的 OKEX 有卡持仓这个问题, 目前比较不好处理。 情况类似 , 下单后, 订单也不再未成交队列了,但是持仓也没有变化,就是卡持仓信息。就导致多开或者多平。

小小梦 这个暂时 没写,不过 有 商品期货的 期货 pyhton 模版, 我的JS 其实 也是 照着 商品期货 的结构写的,可以参考。

outlawjk 不太会用js,有关于okex期货的python模板参考下吗?

小小梦 python 的 没有 期货功能 没移植 >_<

小小梦 return 返回值的意思 ,一般用来 临时储存 一个 函数 返回值 。

simple-chun 感谢感谢

小小梦 https://www.botvs.com/strategy/21104 , 可能和JS 的版本有点 不一样,这个是 照着 JS 的移植的。

小小梦 有python 版本的 ,不过 用的比较少 使用的时候最好 做下测试 。