您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Python中怎么實現一個網格策略,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
'''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 # 參數 beginPrice = 5000 # 網格區間開始價格 endPrice = 8000 # 網格區間結束價格 distance = 20 # 每個網格節點的價格距離 pointProfit = 50 # 每個網格節點的利潤差價 amount = 0.01 # 每個網格節點的掛單量 minBalance = 300 # 賬戶最小資金余額(買入時) # 全局變量 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 : # 撤銷 cancelOrder(arrNet[i]["coverPrice"], ORDER_TYPE_SELL) arrMsg.append("掛單失敗!" + 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], "節點平倉,重置為空閑狀態。", "#FF0000") def onTick () : global arrNet, arrMsg, acc ticker = _C(exchange.GetTicker) # 每次獲取當前最新的行情 for i in range(len(arrNet)): # 遍歷所有網格節點,根據當前行情,找出需要掛單的位置,掛買單。 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 : # 如果錢不夠了,只能跳出,什么都不做了。 arrMsg.append("資金不足" + json.dumps(acc) + "!" + ", time:" + _D()) break orderId = exchange.Buy(arrNet[i]["price"], arrNet[i]["amount"], arrNet[i], ticker) # 掛買單 if orderId : arrNet[i]["state"] = "pending" # 如果買單掛單成功,更新網格節點狀態等信息 arrNet[i]["id"] = orderId else : # 撤單 cancelOrder(arrNet[i]["price"], ORDER_TYPE_BUY) # 使用撤單函數撤單 arrMsg.append("掛單失敗!" + json.dumps(arrNet[i]) + ", time:" + _D()) Sleep(1000) orders = _C(exchange.GetOrders) checkOpenOrders(orders, ticker) # 檢測所有買單的狀態,根據變化做出處理。 Sleep(1000) orders = _C(exchange.GetOrders) checkCoverOrders(orders, ticker) # 檢測所有賣單的狀態,根據變化做出處理。 # 以下為構造狀態欄信息,可以查看FMZ API 文檔。 tbl = { "type" : "table", "title" : "網格狀態", "cols" : ["節點索引", "詳細信息"], "rows" : [], } for i in range(len(arrNet)) : tbl["rows"].append([i, json.dumps(arrNet[i])]) errTbl = { "type" : "table", "title" : "記錄", "cols" : ["節點索引", "詳細信息"], "rows" : [], } orderTbl = { "type" : "table", "title" : "orders", "cols" : ["節點索引", "詳細信息"], "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 (): # 策略執行從這里開始 global arrNet for i in range(int((endPrice - beginPrice) / distance)): # for 這個循環根據參數構造了網格的數據結構,是一個列表,儲存每個網格節點,每個網格節點的信息如下: arrNet.append({ "price" : beginPrice + i * distance, # 該節點的價格 "amount" : amount, # 訂單數量 "state" : "idle", # pending / cover / idle # 節點狀態 "coverPrice" : beginPrice + i * distance + pointProfit, # 節點平倉價格 "id" : -1, # 節點當前相關的訂單的ID }) while True: # 構造好網格數據結構后,進入策略主要循環 onTick() # 主循環上的處理函數,主要處理邏輯 Sleep(500) # 控制輪詢頻率
策略主要設計思路是,根據自己維護的這個網格數據結構,對比GetOrders
接口返回的當前掛單列表。分析掛出的訂單變化(成交與否),更新網格數據結構,做出后續操作。并且掛出的訂單不會撤銷,直到成交,即使價格偏離也不撤銷,因為數字貨幣市場經常有插針的情況,這些掛單也有可能接到插針的單子(如果交易所有掛單數量限制,那就要調整了)。
策略數據可視化,使用了LogStatus
函數把數據實時顯示在狀態欄上。
tbl = { "type" : "table", "title" : "網格狀態", "cols" : ["節點索引", "詳細信息"], "rows" : [], } for i in range(len(arrNet)) : tbl["rows"].append([i, json.dumps(arrNet[i])]) errTbl = { "type" : "table", "title" : "記錄", "cols" : ["節點索引", "詳細信息"], "rows" : [], } orderTbl = { "type" : "table", "title" : "orders", "cols" : ["節點索引", "詳細信息"], "rows" : [], }
構造了三個表格,第一個表格顯示當前網格數據結構中每個節點的信息,第二個表格顯示異常信息,第三個表格顯示交易所實際掛單信息。
看完上述內容,你們對Python中怎么實現一個網格策略有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。