Python spreadsheet platform balancing strategy (teach)

Author: The Little Dream, Date: 2020-02-03 22:43:38
Tags:

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)

More