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); // 轮询间隔,控制 策略运转频率 } }
Dao xươngTrong video hướng dẫn, họ nói rằng đây là một chiến lược rất phổ biến, nhưng mặc định 300 giây ngủ là quá nhiều không?
13036897450Sell ((50.19165, 50.01): order price precision error, scale: `4` Tại sao bạn hỏi?
Dao xươngTốt. Cảm ơn.
Những nhà phát minh định lượng - những giấc mơ nhỏTrong khi đó, một số công ty khác cũng cho rằng, chỉ có 300 millisecond là không đúng.
Những nhà phát minh định lượng - những giấc mơ nhỏ```order price precision error, scale: 4 ``` /upload/asset/cb89c1f8070d7a04d8447f9a38029f2b.png Điều này có nghĩa là giá đặt hàng có quá nhiều chữ số nhỏ, tối đa 4 chữ số.