Sumber dimuat naik... memuat...

Strategi grid mudah dalam versi Python

Penulis:FMZ~Lydia, Dicipta: 2022-12-23 21:00:45, Dikemas kini: 2023-09-20 11:17:48

img

Strategi grid mudah dalam versi Python

Tidak banyak strategi Python di kuadrat strategi. Versi Python strategi grid ditulis di sini. Prinsip strategi sangat mudah. Satu siri nod grid dihasilkan oleh jarak harga tetap dalam julat harga. Apabila pasaran berubah dan harga mencapai kedudukan harga nod grid, pesanan beli diletakkan. Apabila pesanan ditutup, iaitu, mengikut harga pesanan tertunda ditambah spread keuntungan, menunggu pesanan jual untuk menutup kedudukan. Tangkap turun naik dalam julat harga yang ditetapkan.

Tidak perlu dikatakan bahawa risiko strategi grid adalah bahawa mana-mana strategi jenis grid adalah pertaruhan bahawa harga turun naik dalam julat tertentu. Sebaik sahaja harga keluar dari julat grid, ia boleh menyebabkan kerugian terapung yang serius. Oleh itu, tujuan menulis strategi ini adalah untuk memberikan rujukan untuk ide-ide penulisan strategi Python atau reka bentuk program. Strategi ini digunakan untuk pembelajaran sahaja, dan mungkin berisiko dalam bot sebenar.

Penjelasan idea strategi ditulis secara langsung dalam komen kod strategi.

Kod strategi

'''backtest
start: 2019-07-01 00:00:00
end: 2020-01-03 00:00:00
period: 1m
exchanges: [{"eid":"OKEX","currency":"BTC_USDT"}]
'''

import json

# Parameters
beginPrice = 5000   # Grid interval begin price
endPrice = 8000     # Grid interval end price
distance = 20       # Price distance of each grid node
pointProfit = 50    # Profit spread per grid node
amount = 0.01       # Number of pending orders per grid node
minBalance = 300    # Minimum fund balance of the account (at the time of purchase)

# Global variables
arrNet = []
arrMsg = []
acc = None

def findOrder (orderId, NumOfTimes, ordersList = []) :
    for j in range(NumOfTimes) :
        orders = None
        if len(ordersList) == 0:
            orders = _C(exchange.GetOrders)
        else :
            orders = ordersList
        for i in range(len(orders)):
            if orderId == orders[i]["Id"]:
                return True
        Sleep(1000)
    return False

def cancelOrder (price, orderType) :
    orders = _C(exchange.GetOrders)
    for i in range(len(orders)) : 
        if price == orders[i]["Price"] and orderType == orders[i]["Type"]: 
            exchange.CancelOrder(orders[i]["Id"])
            Sleep(500)

def checkOpenOrders (orders, ticker) :
    global arrNet, arrMsg
    for i in range(len(arrNet)) : 
        if not findOrder(arrNet[i]["id"], 1, orders) and arrNet[i]["state"] == "pending" :
            orderId = exchange.Sell(arrNet[i]["coverPrice"], arrNet[i]["amount"], arrNet[i], ticker)
            if orderId :
                arrNet[i]["state"] = "cover"
                arrNet[i]["id"] = orderId                
            else :
                # Cancel
                cancelOrder(arrNet[i]["coverPrice"], ORDER_TYPE_SELL)
                arrMsg.append("Pending order failed!" + json.dumps(arrNet[i]) + ", time:" + _D())

def checkCoverOrders (orders, ticker) :
    global arrNet, arrMsg
    for i in range(len(arrNet)) : 
        if not findOrder(arrNet[i]["id"], 1, orders) and arrNet[i]["state"] == "cover" :
            arrNet[i]["id"] = -1
            arrNet[i]["state"] = "idle"
            Log(arrNet[i], "The node closes the position and resets to the idle state.", "#FF0000")


def onTick () :
    global arrNet, arrMsg, acc

    ticker = _C(exchange.GetTicker)    # Get the latest current ticker every time
    for i in range(len(arrNet)):       # Iterate through all grid nodes, find out the position where you need to pend a buy order according to the current market, and pend a buy order.
        if i != len(arrNet) - 1 and arrNet[i]["state"] == "idle" and ticker.Sell > arrNet[i]["price"] and ticker.Sell < arrNet[i + 1]["price"]:
            acc = _C(exchange.GetAccount)
            if acc.Balance < minBalance :     # If there is not enough money left, you can only jump out and do nothing.
                arrMsg.append("Insufficient funds" + json.dumps(acc) + "!" + ", time:" + _D())
                break

            orderId = exchange.Buy(arrNet[i]["price"], arrNet[i]["amount"], arrNet[i], ticker) # Pending buy orders
            if orderId : 
                arrNet[i]["state"] = "pending"   # Update the grid node status and other information if the buy order is successfully pending
                arrNet[i]["id"] = orderId
            else :
                # Cancel h/the order
                cancelOrder(arrNet[i]["price"], ORDER_TYPE_BUY)    # Cancel orders by using the cancel function
                arrMsg.append("Pending order failed!" + json.dumps(arrNet[i]) + ", time:" + _D())
    Sleep(1000)
    orders = _C(exchange.GetOrders)    
    checkOpenOrders(orders, ticker)    # Check the status of all buy orders and process them according to the changes.
    Sleep(1000)
    orders = _C(exchange.GetOrders)    
    checkCoverOrders(orders, ticker)   # Check the status of all sell orders and process them according to the changes.

    # The following information about the construction status bar can be found in the FMZ API documentation.
    tbl = {
        "type" : "table", 
        "title" : "grid status",
        "cols" : ["node index", "details"], 
        "rows" : [], 
    }    

    for i in range(len(arrNet)) : 
        tbl["rows"].append([i, json.dumps(arrNet[i])])

    errTbl = {
        "type" : "table", 
        "title" : "record",
        "cols" : ["node index", "details"], 
        "rows" : [], 
    }

    orderTbl = {
     	"type" : "table", 
        "title" : "orders",
        "cols" : ["node index", "details"], 
        "rows" : [],    
    }

    while len(arrMsg) > 20 : 
        arrMsg.pop(0)

    for i in range(len(arrMsg)) : 
        errTbl["rows"].append([i, json.dumps(arrMsg[i])])    

    for i in range(len(orders)) : 
        orderTbl["rows"].append([i, json.dumps(orders[i])])

    LogStatus(_D(), "\n", acc, "\n", "arrMsg length:", len(arrMsg), "\n", "`" + json.dumps([tbl, errTbl, orderTbl]) + "`")


def main ():         # Strategy execution starts here
    global arrNet
    for i in range(int((endPrice - beginPrice) / distance)):        # The for loop constructs a data structure for the grid based on the parameters, a list that stores each grid node, with the following information for each grid node:
        arrNet.append({
            "price" : beginPrice + i * distance,                    # Price of the node
            "amount" : amount,                                      # Number of orders
            "state" : "idle",    # pending / cover / idle           # Node Status
            "coverPrice" : beginPrice + i * distance + pointProfit, # Node closing price
            "id" : -1,                                              # ID of the current order related to the node
        })
        
    while True:    # After the grid data structure is constructed, enter the main strategy loop
        onTick()   # Processing functions on the main loop, the main processing logic
        Sleep(500) # Control polling frequency

Idea reka bentuk utama strategi ini adalah untuk membandingkan senarai semasa pesanan menunggu dikembalikan olehGetOrdersAntara muka mengikut struktur data grid yang dikekalkan oleh anda sendiri. Menganalisis perubahan pesanan tertunda (sama ada mereka ditutup atau tidak), mengemas kini struktur data grid, dan membuat operasi berikutnya. Di samping itu, pesanan tertunda tidak akan dibatalkan sehingga transaksi selesai, walaupun harga menyimpang, kerana pasaran mata wang digital sering mempunyai keadaan pin, pesanan tertunda ini juga boleh menerima pesanan pin (jika jumlah pesanan tertunda terhad di bursa, ia akan disesuaikan).

Visualisasi data strategi menggunakanLogStatusfungsi untuk memaparkan data pada bar status dalam masa nyata.

    tbl = {
        "type" : "table", 
        "title" : "grid status",
        "cols" : ["node index", "details"], 
        "rows" : [], 
    }    

    for i in range(len(arrNet)) : 
        tbl["rows"].append([i, json.dumps(arrNet[i])])

    errTbl = {
        "type" : "table", 
        "title" : "record",
        "cols" : ["node index", "details"], 
        "rows" : [], 
    }

    orderTbl = {
     	"type" : "table", 
        "title" : "orders",
        "cols" : ["node index", "details"], 
        "rows" : [],    
    }

Tiga jadual dibina. Jadual pertama memaparkan maklumat setiap nod dalam struktur data grid semasa, jadual kedua memaparkan maklumat yang tidak normal, dan jadual ketiga memaparkan maklumat penyenaraian sebenar pertukaran.

Ujian belakang

img img img

Alamat Strategi

Alamat Strategi

Strategi ini adalah untuk tujuan pembelajaran dan backtesting sahaja, dan ia boleh dioptimumkan dan dinaik taraf jika anda berminat.


Berkaitan

Lebih lanjut