数字货币--网格变形策略之单边网格 (注释版)
策略介绍
- 网格可以自定义方向
- 先买后卖:
网格会从首价格开始向下挂买单, 每个买单间隔 “价格间隔” 这个参数, 挂单数量为”单笔数量”, 挂够 “总数量” 个买单, 有任意买单成交以后, 程序会在买价基础上加 “价差(元)” 这个参数的的值的价格挂出卖单, 卖出, 卖出以后,重新按原来这个网格的价格挂买入单 - 先卖后买:
操作刚好相反 - 策略最大的风险就是单边行情, 价格波动超出网格范围.
- 网格带有自动止损和移动功能
该策略为数字货币版,商品期货版注释ing...
注释心得:策略使用了 虚拟挂单设计, 对于交易所 限制挂单数量,做出了很棒的 处理,灵活的解决了该问题。
网格逻辑设计灵活,结构巧妙。
盈亏计算,各个数值统计 算法可借鉴,各个条件检测设计严谨。(能尽量 减少BUG 出现可能)
源代码 非常值得学习。
注释代码
- 界面参数 (代码中体现为全局变量)
- 变量 描述 类型 默认值
- OpType 网格方向 下拉框(selected) 先买后卖|先卖后买
- FirstPriceAuto 首价格自动 布尔型(true/false) true
- FirstPrice@!FirstPriceAuto 首价格 数字型(number) 100
- AllNum 总数量 数字型(number) 10
- PriceGrid 价格间隔 数字型(number) 1
- PriceDiff 价差(元) 数字型(number) 2
- AmountType 订单大小 下拉框(selected) 买卖同量|自定义量
- AmountOnce@AmountType==0 单笔数量 数字型(number) 0.1
- BAmountOnce@AmountType==1 买单大小 数字型(number) 0.1
- SAmountOnce@AmountType==1 卖单大小 数字型(number) 0.1
- AmountCoefficient@AmountType==0 量差 字符串(string) *1
- AmountDot 量小数点最长位数 数字型(number) 3
- EnableProtectDiff 开启价差保护 布尔型(true/false) false
- ProtectDiff@EnableProtectDiff 入市价差保护 数字型(number) 20
- CancelAllWS 停止时取消所有挂单 布尔型(true/false) true
- CheckInterval 轮询间隔 数字型(number) 2000
- Interval 失败重试间隔 数字型(number) 1300
- RestoreProfit 恢复上次盈利 布尔型(true/false) false
- LastProfit@RestoreProfit 上次盈利 数字型(number) 0
- ProfitAsOrg@RestoreProfit 上次盈利算入均价 布尔型(true/false) false
- EnableAccountCheck 启用资金检验 布尔型(true/false) true
- EnableStopLoss@EnableAccountCheck 开启止损 布尔型(true/false) false
- StopLoss@EnableStopLoss 最大浮动亏损(元) 数字型(number) 100
- StopLossMode@EnableStopLoss 止损后操作 下拉框(selected) 回收并退出|回收再撒网
- EnableStopWin@EnableAccountCheck 开启止盈 布尔型(true/false) false
- StopWin@EnableStopWin 最大浮动盈利(元) 数字型(number) 120
- StopWinMode@EnableStopWin 止盈后操作 下拉框(selected) 回收并退出|回收再撒网
- AutoMove@EnableAccountCheck 自动移动 布尔型(true/false) false
- MaxDistance@AutoMove 最大距离(元) 数字型(number) 20
- MaxIdle@AutoMove 最大空闲(秒) 数字型(number) 7200
- EnableDynamic 开启动态挂单 布尔型(true/false) false
- DynamicMax@EnableDynamic 订单失效距离(元) 数字型(number) 30
- ResetData 启动时清空所有数据 布尔型(true/false) true
- Precision 价格小数位长度 数字型(number) 5function hasOrder(orders, orderId) { // 检测 参数 orders 中 是否有 ID 为 orderId 的订单
- for (var i = 0; i < orders.length; i++) { // 遍历 orders 检测 是否 有相同的 id , 找到 返回 true
- if (orders[i].Id == orderId) {
- return true;
- }
- }
- return false; // 全部遍历完 ,没有触发 if 则 没有找到 ID 为 orderId 的订单, 返回 false
- }
- function cancelPending() { // 取消所有挂单 函数
- var ret = false; // 设置 返回成功 标记变量
- while (true) { // while 循环
- if (ret) { // 如果 ret 为 true 则 Sleep 一定时间
- Sleep(Interval);
- }
- var orders = _C(exchange.GetOrders); // 调用 API 获取 交易所 未完成的订单信息
- if (orders.length == 0) { // 如果返回的是 空数组, 即 交易所 没有未完成的订单。
- break; // 跳出 while 循环
- }
- for (var j = 0; j < orders.length; j++) { // 遍历 未完成的 订单数组, 并根据索引j 逐个使用 orders[j].Id 去 取消订单。
- exchange.CancelOrder(orders[j].Id, orders[j]);
- ret = true; // 一旦有取消操作, ret 赋值 为 true 。用于触发 以上 Sleep , 等待后重新 exchange.GetOrders 检测
- }
- }
- return ret; // 返回 ret
- }
- function valuesToString(values, pos) { // 值 转换 为字符串
- var result = ''; // 声明一个用于返回的 空字符串 result
- if (typeof(pos) === 'undefined') { // 如果 没有传入 pos 这个参数 ,给 pos 赋值 0
- pos = 0;
- }
- for (var i = pos; i < values.length; i++) { // 根据 传入的 pos 处理 values 数组
- if (i > pos) { // 除了第一次 循环 之后 在result 字符串后 加上 ' ' 一个空格
- result += ' ';
- }
- if (values[i] === null) { // 如果 values (函数 参数列表 数组) 当前的索引的 元素 为 null 则 result 添加 'null'字符串
- result += 'null';
- } else if (typeof(values[i]) == 'undefined') { // 如果 是 未定义的, 则添加 'undefined'
- result += 'undefined';
- } else { // 剩余类型 做 switch 检测 分别处理
- switch (values[i].constructor.name) { // 检查 values[i] 的 constructor 的 name 属性, 即类型 名称
- case 'Date':
- case 'Number':
- case 'String':
- case 'Function':
- result += values[i].toString(); // 如果是 日期类型、数值类型、字符串类型、函数类型 ,调用其 toString 函数 转换为字符串 后,添加
- break;
- default:
- result += JSON.stringify(values[i]); // 其他情况 则 使用JSON.stringify 函数 转换为 JSON 字符串 添加到 result
- break;
- }
- }
- }
- return result; // 返回 result
- } // 代码超出字数限制了,所以 节选到此。
欢迎来BotVS 一起学习
原文转载自知乎: https://zhuanlan.zhihu.com/p/29116726
源码地址【 BotVS】 : https://www.botvs.com/bbs-topic/1069


雷达卡


京公网安备 11010802022788号







