Reka bentuk Sistem Pengurusan Pengaturcaraan Pengaturcaraan Berasaskan FMZ Quant (2)

Penulis:Lydia, Dicipta: 2022-11-08 11:34:20, Dikemas kini: 2023-09-15 20:48:46

img

Reka bentuk Sistem Pengurusan Pengaturcaraan Pengaturcaraan Berasaskan FMZ Quant (2)

Sistem Pengurusan Pengampunan Perintah (Synchronous Server)

Mari kita teruskan perbincangan dari artikel sebelumnya: Reka bentuk Sistem Pengurusan Pengaturcaraan Perintah Berdasarkan Kuantifikasi FMZ (1) (https://www.fmz.com/digest-topic/9729) dan mula merancang strategi untuk mengikuti pesanan yang diselaraskan.

Fikirkan beberapa isu reka bentuk seperti itu:

    1. Jika anda tidak mahu menjalankan perintah sinkronis mengikut sementara, adakah mungkin untuk menghentikan ia? Melaksanakan fungsi ini dengan menambah 2 pembolehubah global:
var isStopFollow = false   // Used to mark whether the current order is being followed
var reStartPwd = null      // Used to record the restart password

img

Kemudian kita menambah kawalan interaktif pada halaman penyuntingan strategi untuk strategi jeda / memulakan semula (bukan untuk menghentikan bot sebenar, hanya jeda logik, tidak lagi perintah-mengikuti).Order Synchronization Management System Class Library (Single Server)Apabila memulakan semula perintah berikut, masukkan kata laluan yang ditetapkan untuk membangunkan fungsi perintah berikut. Kod untuk pelaksanaan fungsi yang berkaitan:

...
          // 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. Anda boleh menentukan jumlah perintah untuk diikuti atau boleh diskalakan dalam kelipatan Tambah parameter kepada strategi:

img

specifiedAmount: Tentukan bilangan perintah yang diikuti, lalai adalah -1, iaitu tidak ditentukan. zoomAmountRatio: Skala mengikut jumlah pesanan yang dihantar, contohnya, jika isyarat yang dihantar adalah: ETH_USDT,swap,buy,1, kalikan nilai jumlah pesanan dengan zoomAmountRatio.

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

Di sini ia dilaksanakan untuk skala atau menentukan nilai tertentu untuk jumlah pesanan yang akan diikuti dalam isyarat yang diterima.

    1. Kod harus semudah mungkin, gunakan perpustakaan templat lain untuk membuat pesanan.

Perpustakaan kelas yang digunakan oleh pesanan spot diletakkan:https://www.fmz.com/strategy/10989Perpustakaan kelas yang digunakan oleh pesanan masa depan diletakkan: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
  }

Jadi kita boleh lihat bahawa meletakkan pesanan hanya memerlukan satu ayat:$.Sell(amount), $.Buy(amount), $.OpenLong(exchange, action.ct, amount). dan lain-lain

Kod strategi:

Kod sementara dari sebelum iniOrder Synchronous Management System (Synchronous Server)adalah seperti berikut:

img

Sekarang kita mula reka bentuk semula Sistem Pengurusan Pengadun Perintah (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)
    }
}

Ujian

Kami menguji akaun pimpinan pesanan dengan menggunakan bot sebenar Binance untuk masa ini, dan kami menggunakan akaun OKEX untuk bot sebenar mengikut pesanan.mainfungsi dalam fungsi ujian(Order Synchronization Management System Class Library (Single Server)dalam templat) yang digunakan dalam artikel sebelumnya.

img

Di sini kita mengubah arah transaksi menjadi jual, dan jumlah transaksi menjadi 0.003 (Perintah boleh diletakkan dalam angka perpuluhan untuk kontrak standard Binance USDT). Tetapi perintah berikut untuk akaun OKEX mesti menjadi nombor bulat (perintah pertukaran OKEX mesti menjadi nombor bulat), jadi kita menentukan parameter strategi specifiedAmount sebagai 1.

img

Seterusnya, mari kita menguji penutupan kedudukan dengan mengubah arah perintah dalam fungsi utama ujian untuk menutup kedudukan pendek dengan 0.003.

img

Kemudian kita menjalankannya lagi, yang bertanggungjawab untuk perintah-pemimpin (Order Synchronization Management System Class Library (Single Server)).

Operasi yang sama telah dicetuskan oleh robot sebenar yang mengikuti arahan.

Alamat strategi: Perpustakaan Kelas Sistem Pengurusan Pengaturan Simkronisasi Perintah (Perkhidmatan Tunggal) (https://www.fmz.com/strategy/345171) Sistem Pengurusan Simkronisasi Perintah (Synchronous Server)https://www.fmz.com/strategy/345172)

Strategi ini direka untuk komunikasi dan pembelajaran sahaja, sila menyesuaikan dan mengoptimumkan mengikut keperluan sebenar.


Berkaitan

Lebih lanjut