Skip to content

Latest commit

 

History

History
499 lines (399 loc) · 18.1 KB

比特币现货阶梯差价对冲.md

File metadata and controls

499 lines (399 loc) · 18.1 KB

Name

比特币现货阶梯差价对冲

Author

我要发

Strategy Description

阶梯差价对冲,新手策略

Strategy Arguments

Argument Default Description
jizhun true 基准
fanwei 5 范围
maxliang 0.5 最大下单
xianbijia 6000 最近的币价
lirun true 利润
zhanghushu 12 账户数量

Source (javascript)

function main() {

    var dongjieqian = 0;
    var lessbuyx = 33;
    var lesssellx = 33;
    var lastlessbuyx = 0
    var lastlesssellx = 0
    var huai = 0;
    var hbss;
    var okss;
    var accounthb;
    var accountok;
    var depthok;
    var depthhb;
    var bok;
    var bokl;
    var sok;
    var sokl;
    var bhb;
    var bhbl;
    var shb;
    var shbl;
    var qok;
    var cok;
    var qhb;
    var chb;
    var xx = 0;
    var yy = 0;
    var lastdepthhb = exchanges[0].GetDepth();
    var lastdepthok = exchanges[1].GetDepth();
    var hbx; //火币卖的程度
    var hby; //火币买的程度
    var cps; //火币卖的触发价格
    var iam; //交易的数量
    var huajia; //滑价
    var ii; //用来判断火币是否交易
    var shiyongjizhun; //使用基准
    shiyongjizhun = jizhun;
    while (true) {
        var tss = new Date();
        Log("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^")
        var ts = new Date();
        Log("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");

        Log("开始获取账户资金时间", ts.getSeconds());

        // 这下面是获取账户
        var accounts = [];
        while (true) {
            for (var i = 0; i < exchanges.length; i++) {
                if (accounts[i] == null) {
                    // 创建异步操作
                    accounts[i] = exchanges[i].Go("GetAccount");
                }
            }
            var failed = 0;
            for (var i = 0; i < exchanges.length; i++) {
                if (typeof(accounts[i].wait) != "undefined") {
                    // 等待结果
                    var ret = accounts[i].wait();
                    if (ret) {
                        accounts[i] = ret;
                        Log(exchanges[i].GetName(), accounts[i]);
                    } else {
                        // 重试
                        accounts[i] = null;
                        failed++;
                    }
                }
            }
            if (failed == 0) {
                break;
            } else {
                break;
            }
        }

        Log("获取账户资金耗时 ", (new Date().getTime() - ts.getTime()) / 1000, "秒");
        Log("*********************************************************************");

       




        var ts = new Date();
        Log("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");

        Log("开始获取火币未完成订单", ts.getSeconds());
        var orders = exchanges[0].GetOrders()
        Log(orders);
        var fb = 0,
            fs = 0;
        if (orders === null) {} else {
            for (var i = 0; i < orders.length; i++) {
                if (orders[i].Type === 1) {
                    fs = fs + orders[i].Amount - orders[i].DealAmount
                }

                if (orders[i].Type === 0) {
                    fb = fb + orders[i].Amount * orders[i].Price - orders[i].DealAmount * orders[i].AvgPrice
                }
            }
        }


        Log("火币冻结钱 ", fb, "冻结币", fs);
        Log("获取火币未完成订单耗时 ", (new Date().getTime() - ts.getTime()) / 1000, "秒");
        Log("*********************************************************************");


        accounthb = accounts[0];
        accountok = accounts[1];
        Log(accounts[0]);
        Log(accounts[1]);

        if (!accounthb) {
            Log("获取火币账户信息失败");
            continue;
        }
        if (!accountok) {
            Log("获取ok账户信息失败");
            continue;
        }


        qok = accountok.Balance;
        cok = accountok.Stocks;
        qhb = accounthb.Balance;
        chb = accounthb.Stocks;


        Log("冻结的总资金=", accountok.FrozenBalance + fb + accountok.FrozenStocks * xianbijia + fs * xianbijia)
        if (accountok.FrozenBalance + fb + accountok.FrozenStocks * xianbijia + fs * xianbijia > 2500) {
            Log("冻结资金超过上限");
            continue;
        }
        //火币能卖的量 chb 
        //ok能买的量 qok/sok 
        //二者取小Math.min(chb,qok/sok)
        //火币已卖的量 qhb/bhb 
        //ok已买的量 cok 
        //二者取小Math.min(cok,qhb/bhb)
        //火币已经卖的程度 hbx=Math.min(cok,qhb/bhb)/(Math.min(chb,qok/sok)+Math.min(cok,qhb/bhb))



        //---------------
        // 获取市场深度
        var ts = new Date();
        Log("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");

        Log("开始获取市场深度时间", ts.getSeconds());
        var depths = [];
        while (true) {
            for (var i = 0; i < exchanges.length; i++) {
                if (depths[i] == null) {
                    // 创建异步操作
                    depths[i] = exchanges[i].Go("GetDepth");
                }
            }
            var failed = 0;
            for (var i = 0; i < exchanges.length; i++) {
                if (typeof(depths[i].wait) != "undefined") {
                    // 等待结果         
                    var ret = depths[i].wait();
                    if (ret) {
                        depths[i] = ret;

                        Log(exchanges[i].GetName(), depths[i]);
                    } else {
                        // 重试
                        depths[i] = null;
                        failed++;
                    }
                }
            }
            if (failed == 0) {
                break;
            } else {
                break;


            }
        }
        depthhb = depths[0];
        depthok = depths[1];
        //判断深度是否有效
        if (!depthhb) {
            Log("获取火币深度信息失败");
            continue;
        }
        if (!depthok) {
            Log("获取ok深度信息失败");
            continue;
        }




        if (depthhb.Bids[0].Price === lastdepthhb.Bids[0].Price && depthhb.Bids[0].Amount === lastdepthhb.Bids[0].Amount && depthhb.Asks[0].Price === lastdepthhb.Asks[0].Price && depthhb.Asks[0].Amount === lastdepthhb.Asks[0].Amount) {

            ++xx;
  Log(xx);

        } else {
            xx = 0;
        }
    if(depthok.Bids[0].hasOwnProperty("Price") ){Log("包含price属性")}else{Log("不包含price属性");continue}
       
    if (depthok.Bids[0].Price === lastdepthok.Bids[0].Price && depthok.Bids[0].Amount === lastdepthok.Bids[0].Amount && depthok.Asks[0].Price === lastdepthok.Asks[0].Price && depthok.Asks[0].Amount === lastdepthok.Asks[0].Amount) {

            ++yy;
             Log(yy);
        } else {
            yy = 0;
        }
        lastdepthhb = depthhb;
        lastdepthok = depthok;
        if (xx> 20) {
            Log("火币深度无效");
            continue;
        }
        if (yy > 20) {
            Log("ok深度无效");
            continue;
        }
        bok = depthok.Bids[0].Price;
        bokl = depthok.Bids[0].Amount;
        sok = depthok.Asks[0].Price;
        sokl = depthok.Asks[0].Amount;
        bhb = depthhb.Bids[0].Price;
        bhbl = depthhb.Bids[0].Amount;
        shb = depthhb.Asks[0].Price;
        shbl = depthhb.Asks[0].Amount;
        Log("火币买一", bhb, "火币卖一", shb, "火币盘口差", shb - bhb);
        Log("ok卖一", sok, "ok买一", bok, "ok盘口差", sok - bok);
        Log("获取市场深度耗时 ", (new Date().getTime() - ts.getTime()) / 1000, "秒");
        Log("*********************************************************************");


        //下面计算买卖补充系数
        //如果=33 计算 如果不等于33,不计算
        if (lesssellx === 33) {
            Log("计算少买少卖数量")

            dongjieqian = accountok.FrozenBalance + fb;
            if (dongjieqian < 5) {
                dongjieqian = 0
            }
            lesssellx = dongjieqian / (bok * zhanghushu)
            lessbuyx = (accountok.FrozenStocks + fs) / zhanghushu
        }


        Log("少卖数=", lesssellx, "少买数=", lessbuyx)




        //下面计算火币卖的情况
        while (true) {
            ii = 0; //火币未交易
            //火币能卖的量 chb 
            //ok能买的量 qok/sok 
            //二者取小Math.min(chb,qok/sok)
            //火币已卖的量 qhb/bhb 
            //ok已买的量 cok 
            //二者取小Math.min(cok,qhb/bhb)

            hbx = Math.min(cok, qhb / bhb) / (Math.min(chb, qok / sok) + Math.min(cok, qhb / bhb));
            Log("火币卖程度", hbx);
          /*  if (hbx > 0.5) {
                if (shiyongjizhun + fanwei * 0.5 > 0) {
                    Log("中心靠右,右移,速度缩减系数=", 1 - (shiyongjizhun + fanwei * 0.5) / 5);
                    shiyongjizhun = shiyongjizhun + 0.001 * (1 - (shiyongjizhun + fanwei * 0.5) / 5) * (hbx - 0.5);
                    Log("使用基准=", shiyongjizhun, "增加", 0.001 * (1 - (shiyongjizhun + fanwei * 0.5) / 5) * (hbx - 0.5));
                } else {
                    Log("中心靠左,右移,速度增加系数=", 1 - (shiyongjizhun + fanwei * 0.5) / 5);

                    shiyongjizhun = shiyongjizhun + 0.001 * (1 - (shiyongjizhun + fanwei * 0.5) / 5) * (hbx - 0.5);
                    Log("使用基准=", shiyongjizhun, "增加", 0.001 * (1 - (shiyongjizhun + fanwei * 0.5) / 5) * (hbx - 0.5));
                }

            } else {
                if (shiyongjizhun + fanwei * 0.5 > 0) {
                    Log("中心靠右,左移,速度增加系数=", 1 + (shiyongjizhun + fanwei * 0.5) / 5);
                    shiyongjizhun = shiyongjizhun + 0.001 * (1 + (shiyongjizhun + fanwei * 0.5) / 5) * (hbx - 0.5);
                    Log("使用基准=", shiyongjizhun, "减小", 0.001 * (1 + (shiyongjizhun + fanwei * 0.5) / 5) * (hbx - 0.5));
                } else {
                    Log("中心靠左,左移,速度缩减系数=", 1 + (shiyongjizhun + fanwei * 0.5) / 5);
                    shiyongjizhun = shiyongjizhun + 0.001 * (1 + (shiyongjizhun + fanwei * 0.5) / 5) * (hbx - 0.5);
                    Log("使用基准=", shiyongjizhun, "减小", 0.001 * (1 + (shiyongjizhun + fanwei * 0.5) / 5) * (hbx - 0.5));


                }

            }*/


            cps = shiyongjizhun + fanwei * hbx;
            if (cps > ((bhb - sok))) {
                Log("火币已卖程度", hbx,"第一触发差价", cps, "实际差价", bhb-sok, "不会触发第一种");
                break;
            }
            huajia = Math.abs((bhb - sok - cps) / 2) + 0.25 * lirun;
            huajia = _N(huajia, 2);
            iam = Math.min(chb, qok / (sok + huajia), bhbl, sokl, maxliang);
            iam = _N(iam, 2);
            Log("第一最大量=", maxliang)
            Log("程度", hbx, "火币卖至少赚差价", cps, "实际赚差价", bhb - sok, "滑价=(1/2实际赚差价-至少赚差价)+0.25利润=", huajia, "下单量", iam);

            if (iam < 0.01) {
                break;
            } else {
                var hbid = exchanges[0].Go("Sell", bhb - huajia, Math.max((iam - lesssellx), 0.01));
                var okid = exchanges[1].Buy(sok + huajia, Math.max((iam - lessbuyx), 0.01));
                lastlesssellx = lesssellx;
                lastlessbuyx = lessbuyx;
                lesssellx = 33;
                lessbuyx = 33;
                ++ii; //火币已经交易
                ++huai;
                /* 不计算损失率,加速      
         Sleep(200);
          
    hbid = hbid.wait()
                if (!hbid) {
                   
                    break;
                }
                var order = exchanges[0].GetOrder(hbid);
                if (!order) {
                   
                    break;
                }
                hbss = bhb * Math.max((iam-lastlesssellx),0.01) - order.DealAmount * order.AvgPrice - (bhb - huajia) * (Math.max((iam-lastlesssellx),0.01) - order.DealAmount);
                Log(order);
                Log(hbss, "损失的钱=", "火币买一", bhb, "*", "下单量", Math.max((iam-lastlesssellx),0.01), "-", "已成交量", order.DealAmount, "*", "成交均价", order.AvgPrice, "-(", "火币买一", bhb, "-", "滑价", huajia, ")", "*", "(", "下单量", Math.max((iam-lastlesssellx),0.01), "-", "已成交量", order.DealAmount);
                Log(Math.max((iam-lastlesssellx),0.01) * huajia);
                Log("火币卖损失率=", hbss / (Math.max((iam-lastlesssellx),0.01) * huajia))
                
           */

                /* 不计算损失率,加速 
                  if (!okid) {

                      break;
                  }
                  var order = exchanges[1].GetOrder(okid);
                  if (!order) {
                    
                      break;
                  }

                  okss = 0 - sok * Math.max((iam-lastlessbuyx),0.01) + order.DealAmount * order.AvgPrice + (sok + huajia) * (Math.max((iam-lastlessbuyx),0.01) - order.DealAmount);
                  Log(order);

                  Log(okss, "损失的钱=", "-ok卖一", sok, "*", "下单量", Math.max((iam-lastlessbuyx),0.01), "+", "已成交量", order.DealAmount, "*", "成交均价", order.AvgPrice, "+(", "ok卖一", sok, "+", "滑价", huajia, ")", "*", "(", "下单量", Math.max((iam-lastlessbuyx),0.01), "-", "已成交量", order.DealAmount);
                  Log(Math.max((iam-lastlessbuyx),0.01) * huajia);
                  Log("ok买损失率=", okss / (Math.max((iam-lastlessbuyx),0.01) * huajia))
                  
                    */


                break;


            }

            //触发价格cps=jizhun+fanwei*hbx
            //下单数量Math.min(chb,qok/(sok+滑价),bhbl,sokl,maxliang)
            //如果下单数量小于0.01 break else 下火币卖单 ok下买单 break
        }
        //下面计算火币买的情况
        while (true) {
            if (ii) {
                Log("火币已经交易过了");
                break;
            } //火币已经交易过了
            Log("没交易过,检测后一种情况");
            //火币能买的量 qhb/shb
            //ok能卖的量 cok 
            //二者取小Math.min(cok,qhb/shb)
            //火币已买的量   chb
            //ok已卖的量 qok/bok
            //二者取小Math.min(chb,qok/bok)
            hby = Math.min(chb, qok / bok) / (Math.min(chb, qok / bok) + Math.min(cok, qhb / shb)); //火币已经买的幅度
            cps = shiyongjizhun + fanwei - lirun - fanwei * hby;
            if (cps < ((shb - bok))) {
                Log("火币已买程度", hby,"第二触发差价", cps, "实际差价", shb-bok, "没有触发第二种");
                break;
            }
            huajia = Math.abs((cps - shb + bok) / 2) + 0.25 * lirun;
            huajia = _N(huajia, 2); //到这
            iam = Math.min(cok, qhb / (shb + huajia), bokl, shbl, maxliang);
            iam = _N(iam, 2);
            Log("第二最大=", maxliang)
            Log("第二程度", hby, "火币买最多亏价差", cps, "实际亏差价", shb - bok, "滑价=(1/2最多亏差价-实际亏差价)+0.25利润=", huajia, "下单量", iam);

            if (iam < 0.01) {
                break;
            } else {
                var hbid = exchanges[0].Go("Buy", shb + huajia, Math.max((iam - lessbuyx), 0.01));
                var okid = exchanges[1].Sell(bok - huajia, Math.max((iam - lesssellx), 0.01));
                lastlesssellx = lesssellx;
                lastlessbuyx = lessbuyx;
                lesssellx = 33;
                lessbuyx = 33;
                ++huai;
                /* 不计算损失率,加速      
                 Sleep(200);
                 hbid = hbid.wait()
                 if (!hbid) {

                     break;
                 }
                 var order = exchanges[0].GetOrder(hbid);
                 if (!order) {
                     
                     break;
                 }

                 hbss = 0 - shb * Math.max((iam-lastlessbuyx),0.01) + order.DealAmount * order.AvgPrice + (shb + huajia) * (Math.max((iam-lastlessbuyx),0.01) - order.DealAmount);
                 Log(order);

                 Log(hbss, "损失的钱=", "-火币卖一", shb, "*", "下单量", Math.max((iam-lastlessbuyx),0.01), "+", "已成交量", order.DealAmount, "*", "成交均价", order.AvgPrice, +"(", "火币卖一", shb, "+", "滑价", huajia, ")", "*", "(", "下单量", Math.max((iam-lastlessbuyx),0.01), "-", "已成交量", order.DealAmount);
                 Log(Math.max((iam-lastlessbuyx),0.01) * huajia);
                 Log("火币买损失率=", hbss / (Math.max((iam-lastlessbuyx),0.01) * huajia))

               
                 if (!okid) {
                    
                     break;
                 }
                 var order = exchanges[1].GetOrder(okid);
                 if (!order) {
                    
                     break;
                 }
                 okss = bok * Math.max((iam-lastlesssellx),0.01) - order.DealAmount * order.AvgPrice - (bok - huajia) * (Math.max((iam-lastlesssellx),0.01) - order.DealAmount);
                 Log(order);
                 Log(okss, "损失的钱=", "ok买一", bok, "*", "下单量", Math.max((iam-lastlesssellx),0.01), "-", "已成交量", order.DealAmount, "*", "成交均价", order.AvgPrice, "-(", "ok买一", bok, "-", "滑价", huajia, ")", "*", "(", "下单量", Math.max((iam-lastlesssellx),0.01), "-", "已成交量", order.DealAmount);
                 Log(Math.max((iam-lastlesssellx),0.01) * huajia);
                 Log("ok卖损失率=", okss / (Math.max((iam-lastlesssellx),0.01) * huajia))
                 
                  */
                break;
            }


        }
        Log("全部使用时间 ", (new Date().getTime() - tss.getTime()) / 1000, "秒!!!!!!!");
        if ((new Date().getTime() - ts.getTime()) < 500) {
            Sleep(500 - (new Date().getTime() - ts.getTime()))
        }


    }
}

Detail

https://www.fmz.com/strategy/30573

Last Modified

2017-01-26 22:10:43