Single Platform Balance Strategy of Python Version
Tags: python, strategy, platform, fmzquant
Published: 2024-05-09 06:43:18

### JavaScript Version
Strategy address: https://www.fmz.com/strategy/345

In this article, let's practice porting a simple JavaScript strategy. Through the strategy porting, we can become more familiar with the call of the FMZ Quant Trading Platform interface, and understand the slight differences between different languages in the platform development strategy. In fact, the difference between the JavaScript version and the Python version is very little, because the interface calls are basically the same.

### Strategy Description
Description quoted from JavaScript version:

 This requires to open a position. For example, if the account has 5000 yuan and one currency, if the value of the currency is greater than the account balance of 5000 yuan and the price difference exceeds the threshold value, for example, if the currency is now worth 6000 yuan, then sell (6000-5000)/6000/2 currencies, indicating that the currency has appreciated and we can convert the money back. If the currency has depreciated, for example, 4000 yuan, then we buy (5000-4000)/4000/2 currencies. If the currency decreases, buy some. If it rises again, sell again, Like the balance, the two sides have different hedges, so I call it the equilibrium strategy

The principle of the strategy is very simple. The code of the JavaScript version is not long, only more than 70 lines. The Python language strategy with more concise grammar is transplanted, and the code is much shorter, which is very suitable for beginners to learn. There are a lot of code shared by developers on the FMZ Quant Trading Platform, and the language supports JavaScript/C++/Python, etc. Therefore, mastering more development languages is not only helpful for learning, research, and development strategies, but also familiar with the various API interfaces of the platform.

### Strategy Code
```
'''backtest
start: 2019-12-01 00:00:00
end: 2020-02-01 11:00:00
period: 1m
exchanges: [{"eid":"OKX","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)
```
The code starts with
```
'''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}]
'''
```
It refers to the backtesting configuration, which means that the backtesting configuration (settings) is saved in the form of code and configured automatically according to the setting during the backtesting. This part can be deleted. If it is deleted, we need to set the backtesting configuration information on the backtesting page manually.
Reference: https://www.fmz.com/bbs-topic/859

The parameters of this strategy are completely consistent with the JavaScript version. The strategy code is also transplanted sentence by sentence. The program structure has not changed. You can compare the strategies written in different languages sentence by sentence.

###Backtesting
Parameter configuration

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cvqchg8bsbe0qd678u54.png)

Statistics

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s400m9h2wnnybu0chmz4.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ihebtomm6do1xekg6n3n.png)

Strategy address: https://www.fmz.com/strategy/183374

The strategy is for reference, learning and back testing only. If you are interested, you can optimize and upgrade it.

From: https://blog.mathquant.com/2022/12/02/single-platform-balance-strategy-of-python-version.html