Thiết kế hệ thống quản lý đồng bộ hóa đơn đặt hàng dựa trên FMZ Quant (2)

Tác giả:Lydia., Tạo: 2022-11-08 11:34:20, Cập nhật: 2023-09-15 20:48:46

img

Thiết kế hệ thống quản lý đồng bộ hóa đơn đặt hàng dựa trên FMZ Quant (2)

Hệ thống quản lý đồng bộ hóa đơn hàng (Server đồng bộ)

Chúng ta hãy tiếp tục với cuộc thảo luận từ bài viết trước: Thiết kế Hệ thống Quản lý Đồng bộ hóa Lệnh dựa trên định lượng FMZ (1) (https://www.fmz.com/digest-topic/9729) và bắt đầu thiết kế một chiến lược theo dõi lệnh đồng bộ.

Hãy nghĩ về một số vấn đề thiết kế như vậy:

    1. Nếu bạn không muốn thực hiện theo lệnh đồng bộ tạm thời, có thể tạm dừng nó không? Một khi bị đình chỉ, nó bị cấm bắt đầu từ API mở rộng, nó phải được xác thực bằng mật khẩu. Thực hiện hàm này bằng cách thêm 2 biến toàn cầu:
var isStopFollow = false   // Used to mark whether the current order is being followed
var reStartPwd = null      // Used to record the restart password

img

Sau đó, chúng tôi thêm các điều khiển tương tác trên trang chỉnh sửa chiến lược để tạm dừng chiến lược / khởi động lại (không dừng bot thực sự, chỉ tạm dừng logic, không theo lệnh nữa). Chúng tôi có thể đặt mật khẩu tạm dừng khi tạm dừng, để ngay cả với bot thực của bạn mở rộng API KEY củaOrder Synchronization Management System Class Library (Single Server)Khi khởi động lại lệnh theo, nhập mật khẩu đặt trước để đánh thức chức năng theo lệnh. Mã để thực hiện các chức năng liên quan:

...
          // Judge the interaction command
          if (arr.length == 2) {
          	// Buttons with controls
          	if (arr[0] == "stop/restart") {
          		// Pause/restart order-following
          		if (!isStopFollow) {
          		    isStopFollow = true
          		    reStartPwd = arr[1]
          		    Log("it has stopped the order-following,", "Set the restart password as:", reStartPwd, "#FF0000")
          		} else if (isStopFollow && arr[1] == reStartPwd) {
          			isStopFollow = false 
          			reStartPwd = null 
          			Log("it has restarted the order-following, ", "Clear the restart password.", "#FF0000")
          		} else if (isStopFollow && arr[1] != reStartPwd) {
          			Log("Restart password error!")
          		}
          	}
          	continue 
          }
    1. Bạn có thể chỉ định số lượng các lệnh để được theo sau hoặc có thể được mở rộng quy mô trong nhiều Thêm tham số vào chiến lược:

img

specifiedAmount: Chỉ định số lệnh theo sau, mặc định là -1, tức là không được chỉ định. zoomAmountRatio: Tỉ lệ theo số lượng lệnh được gửi, ví dụ, nếu tín hiệu được gửi là: ETH_USDT,swap,buy,1, nhân giá trị số lượng lệnh bằng zoomAmountRatio. mặc định là -1, tức là không có tỉ lệ.

    var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
    amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio

Ở đây nó được thực hiện để mở rộng quy mô hoặc xác định một giá trị cụ thể cho số lượng lệnh được theo dõi trong tín hiệu nhận được.

    1. Mã phải đơn giản nhất có thể, sử dụng các thư viện mẫu khác để đặt hàng.

Thư viện lớp được sử dụng bởi các đơn đặt hàng tại chỗ đặt:https://www.fmz.com/strategy/10989Thư viện lớp được sử dụng bởi các đơn đặt hàng trong tương lai đặt:https://www.fmz.com/strategy/203258

  function trade(action) {
      // Switch trading pairs and set up contracts
      exchange.SetCurrency(action.symbol)
      if (action.ct != "spot") {
          exchange.SetContractType(action.ct)        
      }        

      var retTrade = null 
      var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
      amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio    

      if (action.direction == "buy") {
          retTrade = action.ct == "spot" ? $.Buy(amount) : $.OpenLong(exchange, action.ct, amount)
      } else if (action.direction == "sell") {
          retTrade = action.ct == "spot" ? $.Sell(amount) : $.OpenShort(exchange, action.ct, amount)
      } else if (action.direction == "closebuy") {
          retTrade = action.ct == "spot" ? $.Sell(amount) : $.CoverLong(exchange, action.ct, amount)
      } else if (action.direction == "closesell") {
          retTrade = action.ct == "spot" ? $.Buy(amount) : $.CoverShort(exchange, action.ct, amount)
      }
      return retTrade
  }

Vì vậy, chúng ta có thể thấy rằng đặt một lệnh chỉ cần một câu:$.Sell(amount), $.Buy(amount), $.OpenLong(exchange, action.ct, amount). v.v

Mã chiến lược:

Mã tạm thời củaOrder Synchronous Management System (Synchronous Server)là như sau:

img

Bây giờ chúng ta bắt đầu thiết kế lại hệ thống quản lý đồng bộ hóa đơn hàng (Synchronous Server):

// Global variables
var isStopFollow = false
var reStartPwd = null 

function trade(action) {
    // Switch trading pairs and set up contracts
    exchange.SetCurrency(action.symbol)
    if (action.ct != "spot") {
        exchange.SetContractType(action.ct)        
    }    

    var retTrade = null 
    var amount = specifiedAmount == -1 ? action.amount : specifiedAmount
    amount = zoomAmountRatio == -1 ? amount : amount * zoomAmountRatio

    if (action.direction == "buy") {
        retTrade = action.ct == "spot" ? $.Buy(amount) : $.OpenLong(exchange, action.ct, amount)
    } else if (action.direction == "sell") {
    	retTrade = action.ct == "spot" ? $.Sell(amount) : $.OpenShort(exchange, action.ct, amount)
    } else if (action.direction == "closebuy") {
    	retTrade = action.ct == "spot" ? $.Sell(amount) : $.CoverLong(exchange, action.ct, amount)
    } else if (action.direction == "closesell") {
    	retTrade = action.ct == "spot" ? $.Buy(amount) : $.CoverShort(exchange, action.ct, amount)
    }
    return retTrade
}

function parseCmd(cmd) {
	var objAction = {}
	// Parse cmd, such as: ETH_USDT,swap,buy,1
    var arr = cmd.split(",")
    if (arr.length != 4) {
    	return null 
    }
    objAction.symbol = arr[0]
    objAction.ct = arr[1]
    objAction.direction = arr[2]
    objAction.amount = arr[3]
    return objAction
}

function main() {
	// Clear all logs
    LogReset(1)  

    if (isSimulateOKEX) {
    	exchange.IO("simulate", true)
    	Log("Switch to OKEX demo!")
    }

    // Set accuracy
    exchange.SetPrecision(pricePrecision, amountPrecision)

    // Check zoom and specify it cannot be set at the same time
    if (specifiedAmount != -1 && zoomAmountRatio != -1) {
    	throw "it cannot specify simultaneous volume and scaling volume at the same time"
    }

    while (true) {
        var cmd = GetCommand()
        if (cmd) {
            Log("cmd: ", cmd)
            var arr = cmd.split(":")

            // Judge interaction commands
            if (arr.length == 2) {
            	// Buttons with controls
            	if (arr[0] == "stop/restart") {
            		// Pause/restart order-following
            		if (!isStopFollow) {
            		    isStopFollow = true
            		    reStartPwd = arr[1]
            		    Log("it has stopped the order-following.", "Set the restart password as.", reStartPwd, "#FF0000")
            		} else if (isStopFollow && arr[1] == reStartPwd) {
            			isStopFollow = false 
            			reStartPwd = null 
            			Log("it has restarted the order-following", "Clear the restart password.", "#FF0000")
            		} else if (isStopFollow && arr[1] != reStartPwd) {
            			Log("Restart password error!")
            		}
            	}
            	continue 
            }
            
            // Permission to follow orders
            if (!isStopFollow) {
                // Resolve the interaction instructions of order-following signal
                var objAction = parseCmd(cmd)
                if (objAction) {
            	    // The analysis is correct
            	    var ret = trade(objAction)
                } else {
                	Log("Wrong signal command cmd:", cmd)
                }
            }
        }
        
        // Display order-following status
        LogStatus(_D(), isStopFollow ? "Stop Synchronization" : "Keep Synchronization", "\n")

        Sleep(1000)
    }
}

Kiểm tra

Chúng tôi kiểm tra tài khoản dẫn đầu lệnh bằng cách sử dụng Binance bot thực cho thời gian này, và chúng tôi sử dụng tài khoản OKEX cho lệnh theo dõi bot thực.mainChức năng trong chức năng thử nghiệm(Order Synchronization Management System Class Library (Single Server)trong mẫu) được sử dụng trong bài trước.

img

Ở đây chúng ta thay đổi hướng giao dịch thành bán , và khối lượng giao dịch thành 0,003 (Đơn đặt hàng có thể được đặt theo số thập phân cho các hợp đồng tiêu chuẩn Binance USDT). Nhưng lệnh theo dõi cho tài khoản OKEX phải là một số nguyên (đơn đặt hàng trao đổi OKEX phải là một số nguyên), vì vậy chúng ta chỉ định tham số chiến lược specifiedAmount là 1.

img

Tiếp theo, hãy thử đóng vị trí bằng cách thay đổi hướng thứ tự trong chức năng chính thử nghiệm để đóng vị trí ngắn bằng 0,003.

img

Sau đó chúng ta chạy nó một lần nữa, chịu trách nhiệm cho lệnh dẫn đầu (Order Synchronization Management System Class Library (Single Server)).

Hoạt động tương tự đã được kích hoạt bởi một robot thực sự.

Địa chỉ chiến lược: Bộ thư viện lớp Order Synchronization Management System (Single Server) (https://www.fmz.com/strategy/345171) Hệ thống quản lý đồng bộ hóa đơn hàng (Synchronous Server) (https://www.fmz.com/strategy/345172)

Chiến lược được thiết kế chỉ để giao tiếp và học tập, xin vui lòng điều chỉnh và tối ưu hóa theo nhu cầu thực tế.


Có liên quan

Thêm nữa