Loading ...

闪崩机器人 (教学)

Author: 小小梦, Date: 2018-09-27 15:56:48
Tags: Study


function CancelPendingOrders(orders) {                             // 取消所有订单
    for (var j = 0; j < orders.length; j++) {                      // 根据参数传来的 未完成订单数组 , 逐个取消订单。
        exchange.CancelOrder(orders[j].Id, orders[j]);
        Sleep(300);                                                // 间隔 300 毫秒
    }
}
function LogOrders(orders){                                        // 组织用于显示的数据,显示在 机器人 页面的状态栏上。
    var buyString = '';                                            // 用于显示的买单数据字符串
    var sellString = '';                                           // 用于显示的卖单数据字符串
    orders.sort(function(x, y){return x.Price - y.Price;});        // 排序 , orders 根据订单的 Price 属性, 从大到小
    for (var j = 0; j < orders.length; j++) {                      // 遍历 orders  , 注意已经排过序
        if (orders[j].Type == ORDER_TYPE_SELL){                    // 如果 订单是 卖单,则执行{} 内代码。
            sellString += String(orders[j].Price) + ' ' + String(orders[j].Amount) + '|';    // 储存在 字符串 sellString , 用 | 间隔
        }else{
            buyString += String(orders[j].Price) + ' ' + String(orders[j].Amount) + '|';     // 储存在 字符串 buyString , 用 | 间隔
        }
    }
    LogStatus('买单:' + buyString + '\n' + '卖单:' + sellString);                             // 在状态栏 输出这些 订单 信息。
}
function main() {                                           // 主函数
    while(true){                                            // 主循环
        var orders = _C(exchange.GetOrders);                // 获取所有 未完成 挂单信息,orders 为一个 数组。
        CancelPendingOrders(orders);                        // 取消所有未完成挂单
        var ticker = _C(exchange.GetTicker);                // 获取最新行情信息
        var account = _C(exchange.GetAccount);              // 获取 当前账户信息
        var midPrice = (ticker.Buy + ticker.Sell) / 2;      // 计算 盘口空隙中间的位置的价格。
        var buyAmount  = 0;                                 // 声明 buyAmount ,用于累计计划买入数量, 初始化 0
        var sellAmount = 0;                                 // 声明 sellAmount , 用于累计计划卖出数量, 初始化 0
        var amount = OrderSize;                             // OrderSize 每单下单量大小, 赋值给 amount
        var buyPrice = midPrice  - Spread;                  // 在盘口中间位置 上下 一定 挂单价格间隔, 挂单,设置挂买单价 buyPrice
        var sellPrice = midPrice + Spread;                  // ....
        while((buyAmount < TotalBuy) && (account.Balance > amount*buyPrice) && buyPrice > 0){       // 当 计划买入数量 小于 总买单量, 并且 账户可用计价币(资金)大于 本次计划下单使用的资金,并且 下单价格大于0(防止 midPrice - Spread 小于0)
            if(exchange.Buy(buyPrice, amount)){             // 下单,如果返回 null 执行 else 内代码块, 如果返回id 执行 if 代码块
                buyAmount += amount;                        // 累计买单挂单量
                account.Balance -= amount*buyPrice;         // 更新账户 计价币数量
                buyPrice -= Spread;                         // 更新挂单价格
                amount = amount * SpreadTimes;              // 更新订单下单量,根据参数 SpreadTimes 设置进行递增。
            
            }else{                                          // 下单失败,更新账户信息,用于 当前while 循环条件判断
                account = _C(exchange.GetAccount);
            }
            Sleep(500);                                     // 用于控制 挂单频率
        }
        amount = OrderSize;                                 // 重置 amount 变量为 OrderSize
        while((sellAmount < TotalSell) && (account.Stocks*(1-fee/100) > amount)){        // 当 计划卖出的量 小于 总卖单量, 并且 账户可用 币数 扣除 交易手续费后 大于每单数量,执行while 循环
            if(exchange.Sell(sellPrice, amount)){           // 下卖单, 返回订单ID ,更新相关 变量。
                sellAmount += amount;                       // 累计 挂出的卖单的量
                account.Stocks -= amount;                   // 更新 可用币数
                sellPrice += Spread;                        // 更新下单价格 位置
                amount = amount * SpreadTimes;              // 更新订单下单量,根据参数 SpreadTimes 设置进行递增。
            }else{
                account = _C(exchange.GetAccount);          // 如果下单失败 更新账户信息
            }
            Sleep(500);
        }
        orders = _C(exchange.GetOrders);                    // 获取 挂单信息
        LogOrders(orders);                                  // 输出挂单信息 在状态栏
        Sleep(Interval*1000);                               // 轮询间隔,控制 策略运转频率
    }
}

Related

More

小L 现在的盘口间隔连手续费都赚不回来了吧。。。

13036897450 一直返回这个错误 Sell(50.19165, 50.01): order price precision error, scale: `4` 请问是什么原因?

wkr 您好,个人感觉您的策略很像单纯的做市商策略,方便解释一下是怎么抓的抛售情绪吗?谢谢!

小小梦 这个策略思路 赚的不是盘口的差价,是抓闪崩时的 恐慌低价抛售情绪。

小小梦 ```order price precision error, scale: 4``` /upload/asset/cb89c1f8070d7a04d8447f9a38029f2b.png 意思是下单价格小数位数太多了,最多 4位。