avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada Pesan pribadi
4
fokus pada
1271
Pengikut

Perancangan Sistem Manajemen Sinkronisasi Order Berbasis Kuantifikasi FMZ (2)

Dibuat di: 2022-02-16 12:11:36, diperbarui pada: 2023-09-15 20:46:46
comments   0
hits   1431

Perancangan Sistem Manajemen Sinkronisasi Order Berbasis Kuantifikasi FMZ (2)

Perancangan Sistem Manajemen Sinkronisasi Order Berbasis Kuantifikasi FMZ (2)

Pesan Server Sinkron

Mari kita lanjutkan dengan artikel sebelumnya:Perancangan Sistem Manajemen Sinkronisasi Order Berbasis Kuantifikasi FMZ (1)Setelah berdiskusi dengan para ahli, kami mulai merancang strategi untuk perdagangan salinan sinkron.

Pertimbangkan masalah desain berikut:

  • 1. Jika Anda tidak ingin mengikuti perintah secara sinkron untuk saat ini, dapatkah Anda menghentikannya? Setelah dijeda, peluncuran dari API ekstensi dilarang, menggunakan autentikasi kata sandi. Untuk mengimplementasikan fungsi ini, tambahkan dua variabel global:
  var isStopFollow = false   // 用于标记当前是否跟单
  var reStartPwd = null      // 用于记录重启密码

Perancangan Sistem Manajemen Sinkronisasi Order Berbasis Kuantifikasi FMZ (2)

Lalu tambahkan kontrol interaktif di halaman pengeditan strategi untuk menjeda/memulai ulang strategi (ini tidak menghentikan perdagangan sesungguhnya, namun hanya menjeda logika, berhenti mengikuti perintah, dan tidak melakukan apa pun). Saat menjeda, Anda dapat mengatur kata sandi jeda sehingga meskipun Anda memiliki KUNCI API yang diperluas订单同步管理系统类库(Single Server)Bahkan sesi perdagangan nyata tidak dapat membangkitkan strategi Anda. Saat memulai kembali perdagangan salinan, masukkan kata sandi yang telah ditetapkan untuk mengaktifkan fungsi perdagangan salinan. Kode implementasi fungsi terkait:

  ...
            // 判断交互指令
            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 dapat menentukan jumlah pesanan atau menaikkan atau menurunkannya Tambahkan parameter ke strategi:

Perancangan Sistem Manajemen Sinkronisasi Order Berbasis Kuantifikasi FMZ (2)

definedAmount: menentukan jumlah pesanan tindak lanjut. Nilai default adalah -1, yang berarti tidak ditentukan. zoomAmountRatio : memperbesar sesuai dengan jumlah pesanan pada sinyal terkirim, misalnya, sinyal terkirim adalah:ETH_USDT,swap,buy,1, kalikan jumlah pesanan dengan zoomAmountRatio. Nilai defaultnya adalah -1 yang berarti tidak ada skala.

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

Di sini kami menerapkan jumlah pesanan yang perlu diikuti dalam sinyal yang diterimaPerbesaratauTentukan nilai tertentu

  • 3. Buat kode sesingkat mungkin dan gunakan pustaka templat lain untuk pemrosesan pesanan.

Pemesanan spot menggunakan pustaka kelas: https://www.fmz.com/strategy/10989 Perpustakaan pesanan berjangka: 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
    }

Jadi Anda lihat, untuk melakukan pemesanan hanya diperlukan satu kalimat:$.Sell(amount)$.Buy(amount)$.OpenLong(exchange, action.ct, amount) .. Tunggu.

Kode strategi:

Sebelumnya订单同步管理系统(Synchronous Server)Kode sementara ini adalah:

Perancangan Sistem Manajemen Sinkronisasi Order Berbasis Kuantifikasi FMZ (2)

Mulai mendesain ulang sekarang订单同步管理系统(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)
    }
}

tes

Kali ini, akun dengan pesanan akan menggunakan akun riil Binance untuk pengujian, dan akun riil untuk menyalin pesanan akan menggunakan akun OKEX. Kami masih menggunakan fungsi pengujian yang digunakan pada artikel sebelumnya (订单同步管理系统类库(Single Server)Dalam templatemainfungsi).

Perancangan Sistem Manajemen Sinkronisasi Order Berbasis Kuantifikasi FMZ (2)

Kami baru saja mengubah arah transaksi menjadi short selling dan volume transaksi menjadi 0,003 (kontrak berbasis Binance USDT dapat menempatkan pesanan dalam desimal). Namun, akun OKEX harus berupa bilangan bulat (perintah pertukaran OKEX harus ditempatkan dalam bilangan bulat), jadi saya menentukan parameter strategispecifiedAmountadalah 1.

Perancangan Sistem Manajemen Sinkronisasi Order Berbasis Kuantifikasi FMZ (2)

订单同步管理系统类库(Single Server)Fungsi pengujian memicu transaksi nyata.

Perancangan Sistem Manajemen Sinkronisasi Order Berbasis Kuantifikasi FMZ (2)

Strategi real-time untuk menyalin perintah menerima sinyal dan mengeksekusi tindakan penyalinan:

Perancangan Sistem Manajemen Sinkronisasi Order Berbasis Kuantifikasi FMZ (2)

Bursa membuka pesanan yang sesuai.

Perancangan Sistem Manajemen Sinkronisasi Order Berbasis Kuantifikasi FMZ (2)

Selanjutnya, mari kita uji penutupan posisi dan ubah arah order dalam fungsi utama pengujian untuk menutup posisi short sebanyak 0,003 kontrak.

Perancangan Sistem Manajemen Sinkronisasi Order Berbasis Kuantifikasi FMZ (2)

Kemudian jalankan kembali disk sebenarnya yang bertanggung jawab untuk menerima pesanan (订单同步管理系统类库(Single Server))。

Perancangan Sistem Manajemen Sinkronisasi Order Berbasis Kuantifikasi FMZ (2)

Operasi yang sama juga dipicu dengan menyalin pesanan sebenarnya:

Perancangan Sistem Manajemen Sinkronisasi Order Berbasis Kuantifikasi FMZ (2)

Alamat Kebijakan: Pustaka kelas sistem manajemen sinkronisasi pesanan (Server Tunggal) Pesan Server Sinkron

Desain strategi ini hanya untuk komunikasi dan pembelajaran. Harap modifikasi, sesuaikan, dan optimalkan sesuai dengan kebutuhan produksi aktual.