2022-05-20 14:42:13 +08:00
|
|
|
|
|
|
|
|
> 策略名称
|
|
|
|
|
|
2023-04-18 23:12:35 +08:00
|
|
|
币安多交易对-现货-用来市价清仓用的
|
2022-05-20 14:42:13 +08:00
|
|
|
|
|
|
|
|
> 策略作者
|
|
|
|
|
|
|
|
|
|
轻轻的云
|
|
|
|
|
|
|
|
|
|
> 策略描述
|
|
|
|
|
|
|
|
|
|
这个就是用来清仓现货的,
|
|
|
|
|
比如跑多交易对的现货网格、马丁策略,不想跑了,可是手里N多各种币种,挨个卖太麻烦了,
|
|
|
|
|
就用这个就行,把币种输入到参数里面,就自动的市价全都卖了。
|
|
|
|
|
不过有时候卖完之后,还会有估值小于0.0012BTC的资产,这个时候就需要到现货钱包中用【小额资产兑换BNB】了,
|
|
|
|
|
也就是说如果有BNB,最好最后再市价卖掉。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
> 策略参数
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|参数|默认值|描述|
|
|
|
|
|
|----|----|----|
|
|
|
|
|
|B_Sleep_time|5|轮询间隔(秒)|
|
|
|
|
|
|B_symbols|TRX_BUSD,LTC_BUSD,BCH_BUSD|交易对|
|
|
|
|
|
|B_chongzhi|false|重置|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
> 源码 (javascript)
|
|
|
|
|
|
|
|
|
|
``` javascript
|
|
|
|
|
//全局变量
|
|
|
|
|
var arrSymbols = B_symbols.split(",") // 逗号分割交易品种字符串
|
|
|
|
|
|
|
|
|
|
//获取价格精度 数量精度 函数
|
|
|
|
|
function GetPrecision() {
|
|
|
|
|
var precision = {
|
|
|
|
|
price: 0, //精度-价格
|
|
|
|
|
amount: 0 //精度-数量
|
|
|
|
|
}
|
|
|
|
|
var depth = _C(exchange.GetDepth)
|
|
|
|
|
if (!depth) {
|
|
|
|
|
throw '无法连接交易所行情,需要海外托管者'
|
|
|
|
|
}
|
|
|
|
|
for (var i = 0; i < depth.Asks.length; i++) {
|
|
|
|
|
var amountPrecision = depth.Asks[i].Amount.toString().indexOf('.') > -1 ? depth.Asks[i].Amount.toString().split('.')[1].length : 0
|
|
|
|
|
precision.amount = Math.max(precision.amount, amountPrecision) //数量精度
|
|
|
|
|
var pricePrecision = depth.Asks[i].Price.toString().indexOf('.') > -1 ? depth.Asks[i].Price.toString().split('.')[1].length : 0
|
|
|
|
|
precision.price = Math.max(precision.price, pricePrecision) //价格精度
|
|
|
|
|
}
|
|
|
|
|
return precision
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//取消所有挂单函数
|
|
|
|
|
//形参e 是 exchange.SetCurrency() 的 exchange
|
|
|
|
|
function cancelAll(e) {
|
|
|
|
|
while (true) {
|
|
|
|
|
var orders = _C(e.GetOrders)
|
|
|
|
|
if (orders.length == 0) {
|
|
|
|
|
break
|
|
|
|
|
} else {
|
|
|
|
|
for (var i = 0; i < orders.length; i++) {
|
|
|
|
|
e.CancelOrder(orders[i].Id, orders[i])
|
|
|
|
|
Sleep(200)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Sleep(200)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function Trad() {
|
|
|
|
|
for (var i = 0; i < arrSymbols.length; i++) {
|
|
|
|
|
Sleep(500)
|
|
|
|
|
symbol = arrSymbols[i]
|
|
|
|
|
exchange.SetCurrency(symbol)
|
|
|
|
|
var ticker = _C(exchange.GetTicker).Last //最新价
|
|
|
|
|
var precision = GetPrecision() //获取数量精度、价格精度
|
|
|
|
|
var acc = _C(exchange.GetAccount)
|
|
|
|
|
var base_balance = acc.Stocks //币种 可用余额
|
|
|
|
|
var base_FrozenStocks = acc.FrozenStocks //币种挂单冻结的数量
|
|
|
|
|
var holdAmount = _N(parseFloat(base_balance + base_FrozenStocks), precision.amount) //持仓量 = 币种余额+冻结数量
|
|
|
|
|
if (holdAmount == 0 || holdAmount * ticker < 10) { //没有持仓 就是一开始的状态,10USDT价值是币安现货的最小交易金额,小于10的没法交易
|
|
|
|
|
cancelAll(exchange)
|
|
|
|
|
Log(symbol, "没有持仓,或者持仓数量不足以交易,持仓数量:", holdAmount)
|
|
|
|
|
}
|
|
|
|
|
if (holdAmount * ticker >= 10) { //持仓价值 >= USDT价值,则有持仓。
|
|
|
|
|
Log(symbol, "有持仓,持仓数量:", holdAmount, "市价清仓", "#B15BFF")
|
|
|
|
|
cancelAll(exchange)
|
|
|
|
|
Sleep(500)
|
|
|
|
|
var clearsell = exchange.Sell(-1, holdAmount) //清仓
|
|
|
|
|
Sleep(500)
|
|
|
|
|
acc = _C(exchange.GetAccount)
|
|
|
|
|
base_balance = acc.Stocks //币种 可用余额
|
|
|
|
|
base_FrozenStocks = acc.FrozenStocks //币种挂单冻结的数量
|
|
|
|
|
holdAmount = _N(parseFloat(base_balance + base_FrozenStocks), precision.amount) //重新获取持仓数量
|
|
|
|
|
Log(symbol, "持仓数量:", holdAmount, "#B15BFF")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//退出撤销所有挂单
|
|
|
|
|
function onexit() {
|
|
|
|
|
Log("机器人停止,撤销所有挂单", "#6F00D2")
|
|
|
|
|
for (var i = 0; i < arrSymbols.length; i++) {
|
|
|
|
|
symbol = arrSymbols[i]
|
|
|
|
|
exchange.SetCurrency(symbol)
|
|
|
|
|
cancelAll(exchange)
|
|
|
|
|
Sleep(200)
|
|
|
|
|
}
|
|
|
|
|
Sleep(200)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//出错退出撤销所有挂单
|
|
|
|
|
function onerror() {
|
|
|
|
|
Log("机器人出错,撤销所有挂单", "#00BB00")
|
|
|
|
|
for (var i = 0; i < arrSymbols.length; i++) {
|
|
|
|
|
symbol = arrSymbols[i]
|
|
|
|
|
exchange.SetCurrency(symbol)
|
|
|
|
|
cancelAll(exchange)
|
|
|
|
|
Sleep(200)
|
|
|
|
|
}
|
|
|
|
|
Sleep(200)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function main() {
|
|
|
|
|
if (B_chongzhi) {
|
|
|
|
|
// LogProfitReset() //清空收益图表,只清空图表,日志信息不清除
|
|
|
|
|
LogReset() //清空日志。只清空日志,不清除图表。
|
|
|
|
|
LogVacuum()
|
|
|
|
|
Log("重置所有数据", "#FF0000")
|
|
|
|
|
}
|
|
|
|
|
while (true) {
|
|
|
|
|
Trad()
|
|
|
|
|
Sleep(B_Sleep_time * 1000)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
> 策略出处
|
|
|
|
|
|
|
|
|
|
https://www.fmz.com/strategy/360782
|
|
|
|
|
|
|
|
|
|
> 更新时间
|
|
|
|
|
|
|
|
|
|
2022-05-02 10:23:01
|