Reka bentuk Sistem Pengurusan Pemesanan Simultan berdasarkan FMZ Kuantitatif (2)

Penulis:Mimpi kecil, Dicipta: 2022-02-16 12:11:36, Dikemas kini: 2023-09-15 20:46:46

img

Reka bentuk Sistem Pengurusan Pemesanan Simultan berdasarkan FMZ Kuantitatif (2)

Sistem Pengurusan Pemesanan Sinkron (Synchronous Server)

Kita teruskan dengan artikel sebelumnya:Reka bentuk Sistem Pengurusan Pemesanan Simultan Berasaskan Kuantiti FMZ (1)Di samping itu, mereka juga telah membuat perbincangan dan mula merancang strategi untuk menyinkronkan senarai.

Pertimbangkan beberapa isu reka bentuk:

  • 1. Jika anda tidak mahu menyinkronkan akaun untuk sementara waktu, bolehkah anda berhenti?. Setelah berhenti, anda dilarang memulakan dari API pelanjutan, menggunakan pengesahan kata laluan. Untuk mencapai fungsi ini, dua pembolehubah global ditambahkan:

    var isStopFollow = false   // 用于标记当前是否跟单
    var reStartPwd = null      // 用于记录重启密码
    

    img

    Kemudian, pada halaman penyuntingan dasar, anda boleh menambah kawalan interaktif untuk menghentikan/memulakan semula dasar (bukan berhenti cakera ini, hanya berhenti logik, tidak mengikuti senarai, tidak melakukan apa-apa).订单同步管理系统类库(Single Server)Disk tidak dapat membangkitkan dasar anda. Apabila memulakan semula senarai, masukkan kata laluan yang ditetapkan untuk membangkitkan fungsi senarai. Kod pelaksanaan untuk ciri-ciri berkaitan:

    ...
              // 判断交互指令
              if (arr.length == 2) {
              	// 带控件的按钮
              	if (arr[0] == "stop/restart") {
              		// 暂停/重启跟单
              		if (!isStopFollow) {
              		    isStopFollow = true
              		    reStartPwd = arr[1]
              		    Log("已经停止跟单,", "设置的重启密码为:", reStartPwd, "#FF0000")
              		} else if (isStopFollow && arr[1] == reStartPwd) {
              			isStopFollow = false 
              			reStartPwd = null 
              			Log("已经重启跟单,", "清空重启密码。", "#FF0000")
              		} else if (isStopFollow && arr[1] != reStartPwd) {
              			Log("重启密码错误!")
              		}
              	}
              	continue 
              }
    
  • 2, anda boleh menetapkan jumlah yang lebih kecil atau skala ganda Tambah parameter kepada dasar:

    img

    specifiedAmount: Tentukan jumlah senarai, dengan lalai -1, iaitu tidak ditentukan. zoomAmountRatio: Mengukur kuantiti bawah dalam isyarat yang dihantar, contohnya isyarat yang dihantar adalah:ETH_USDT,swap,buy,1, maka nilai jumlah yang paling rendah dikalikan dengan zoomAmountRatio.

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

    Di sini, jumlah pesanan yang diperlukan dalam isyarat yang diterima diwujudkan.MeningkatkanatauTentukan nilai tertentu

  • 3. Kod yang paling ringkas, dengan menggunakan perpustakaan kelas templat yang lain.

    Di bawah ini adalah senarai kategori yang boleh digunakan:https://www.fmz.com/strategy/10989Di bawah ini adalah senarai kelas yang digunakan untuk pesanan hadapan:https://www.fmz.com/strategy/203258

      function trade(action) {
          // 切换交易对,设置合约
          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
      }
    

    Oleh itu, anda boleh lihat, senarai ini hanya memerlukan satu ayat:$.Sell(amount)$.Buy(amount)$.OpenLong(exchange, action.ct, amount)... dan seterusnya.

Kod strategi:

Sebelum ini订单同步管理系统(Synchronous Server)Kod sementara adalah seperti ini:

img

Sekarang, mulakan reka bentuk semula.订单同步管理系统(Synchronous Server)

// 全局变量
var isStopFollow = false
var reStartPwd = null 

function trade(action) {
    // 切换交易对,设置合约
    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 = {}
	// 解析cmd ,例如: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() {
	// 清除所有日志
    LogReset(1)  

    if (isSimulateOKEX) {
    	exchange.IO("simulate", true)
    	Log("切换到OKEX模拟盘!")
    }

    // 设置精度
    exchange.SetPrecision(pricePrecision, amountPrecision)

    // 检查缩放、指定不能同时设置
    if (specifiedAmount != -1 && zoomAmountRatio != -1) {
    	throw "不能同时指定同步量和缩放量"
    }

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

            // 判断交互指令
            if (arr.length == 2) {
            	// 带控件的按钮
            	if (arr[0] == "stop/restart") {
            		// 暂停/重启跟单
            		if (!isStopFollow) {
            		    isStopFollow = true
            		    reStartPwd = arr[1]
            		    Log("已经停止跟单,", "设置的重启密码为:", reStartPwd, "#FF0000")
            		} else if (isStopFollow && arr[1] == reStartPwd) {
            			isStopFollow = false 
            			reStartPwd = null 
            			Log("已经重启跟单,", "清空重启密码。", "#FF0000")
            		} else if (isStopFollow && arr[1] != reStartPwd) {
            			Log("重启密码错误!")
            		}
            	}
            	continue 
            }
            
            // 允许跟单
            if (!isStopFollow) {
                // 解析跟单信号交互指令
                var objAction = parseCmd(cmd)
                if (objAction) {
            	    // 解析正确
            	    var ret = trade(objAction)
                } else {
                	Log("错误的信号指令 cmd:", cmd)
                }
            }
        }
        
        // 显示跟单情况
        LogStatus(_D(), isStopFollow ? "停止同步" : "保持同步", "\n")

        Sleep(1000)
    }
}

Ujian

Dalam kes ini, akaun bandel menggunakan percubaan pada cakera nyata Binance, dan cakera sebenar yang digunakan adalah akaun OKEX.订单同步管理系统类库(Single Server)TemplatmainFungsi) ^

img

Tetapi kita mengubah arah dagangan menjadi kosong, dan jumlah dagangan berubah menjadi 0.003 ((Binance USDT kontrak tempatan boleh mencadangkan bilangan kecil) ‒ Tetapi akaun OKEX akaun mestilah bulat (OKEX pertukaran pesanan mestilah bilangan bulat), jadi parameter saya menetapkan parameter strategispecifiedAmountUntuk 1 ∞

img

订单同步管理系统类库(Single Server)Fungsi ujian pada cakera nyata telah mencetuskan transaksi.

img

Strategi cakera sebenar menerima isyarat dan melakukan tindakan cakera:

img

Pertukaran telah mengeluarkan pesanan yang sepadan.

img

Seterusnya, uji kedudukan rata dengan mengubah arah baris bawah dalam fungsi utama ujian menjadi kedudukan kosong 0.003 yang rata.

img

Kemudian, ia akan mula semula untuk menjalankan cakera yang bertanggungjawab untuk pita.订单同步管理系统类库(Single Server))。

img

Di samping itu, ia juga telah memicu operasi yang sama pada cakera keras tunggal:

img

Alamat strategi:Perpustakaan Kelas Sistem Pengurusan Simkron Perintah (Single Server) Sistem Pengurusan Pemesanan Sinkron (Synchronous Server)

Reka bentuk strategi hanya untuk pembelajaran pertukaran, pengeluaran sebenar memerlukan penyesuaian, penyesuaian, pengoptimuman sendiri.


Berkaitan

Lebih lanjut