Referring to the JavaScript spreadsheet platform balancing policy
This requires building a warehouse, say you have $5,000 in the account, and a coin, and if the value of the coin is greater than the balance in the account is $5,000 and the spread is greater than the depreciation, say the coin is now worth $6,000, you sell it, say $6,000-$5,000, or $6,000-$2,000, or $6,000/$2,000, or $6,000/$2,000, or $6,000/$2,000, or $6,000/$2,000, or $5,000/$4,000, or $4,000/$2,000, or $4,000/$2,000, or $5,000/$4,000, or $4,000/$2,000, or $4,000/$2,000, or $4,000/$2,000, or $4,000/$2,000, or $4,000/$2,000, or $4,000/$2,000, or $4,000/$2,000, or $4,000/$2,000, or $4,000/$2,000, or $4,000/$2,000, or $4,000/$2,000, or $5,000/$2,000, or $4,000/$2,000, or $4,000/$2,000, or $4,000/$2,000, or $4,000/$2,000, or $4,000/$2,000, or $4,000
The article's address:https://www.fmz.com/bbs-topic/4986
'''backtest start: 2019-12-01 00:00:00 end: 2020-02-01 11:00:00 period: 1m exchanges: [{"eid":"OKEX","currency":"BTC_USDT","stocks":1}] ''' InitAccount = None def CancelPendingOrders(): ret = False while True: orders = _C(exchange.GetOrders) if len(orders) == 0 : return ret for j in range(len(orders)): exchange.CancelOrder(orders[j].Id) ret = True if j < len(orders) - 1: Sleep(Interval) return ret def onTick(): acc = _C(exchange.GetAccount) ticker = _C(exchange.GetTicker) spread = ticker.Sell - ticker.Buy diffAsset = (acc.Balance - (acc.Stocks * ticker.Sell)) / 2 ratio = diffAsset / acc.Balance LogStatus("ratio:", ratio, _D()) if abs(ratio) < threshold: return False if ratio > 0 : buyPrice = _N(ticker.Sell + spread, ZPrecision) buyAmount = _N(diffAsset / buyPrice, XPrecision) if buyAmount < MinStock: return False exchange.Buy(buyPrice, buyAmount, diffAsset, ratio) else : sellPrice = _N(ticker.Buy - spread, ZPrecision) sellAmount = _N(-diffAsset / sellPrice, XPrecision) if sellAmount < MinStock: return False exchange.Sell(sellPrice, sellAmount, diffAsset, ratio) return True def main(): global InitAccount, LoopInterval InitAccount = _C(exchange.GetAccount) LoopInterval = max(LoopInterval, 1) while True: if onTick(): Sleep(1000) CancelPendingOrders() Log(_C(exchange.GetAccount)) Sleep(LoopInterval * 1000)