avatar of 发明者量化-小小梦 发明者量化-小小梦
konzentrieren Sie sich auf Private Nachricht
4
konzentrieren Sie sich auf
1271
Anhänger

Entwurf eines Auftragssynchronisationsmanagementsystems auf Basis der FMZ-Quantifizierung (2)

Erstellt in: 2022-02-16 12:11:36, aktualisiert am: 2023-09-15 20:46:46
comments   0
hits   1431

Entwurf eines Auftragssynchronisationsmanagementsystems auf Basis der FMZ-Quantifizierung (2)

Entwurf eines Auftragssynchronisationsmanagementsystems auf Basis der FMZ-Quantifizierung (2)

Synchronous Server bestellen

Fahren wir mit dem vorherigen Artikel fort:Entwurf eines Auftragssynchronisationsmanagementsystems auf Basis der FMZ-Quantifizierung (1)Nach der Diskussion mit den Experten begannen wir, eine Strategie für das synchrone Copy-Trading zu entwickeln.

Berücksichtigen Sie die folgenden Entwurfsaspekte:

  • 1. Wenn Sie Aufträge vorerst nicht synchron ausführen möchten, können Sie dies pausieren? Nach der Pause ist der Start über die Erweiterungs-API mithilfe der Kennwortauthentifizierung untersagt. Um diese Funktion zu implementieren, fügen Sie zwei globale Variablen hinzu:
  var isStopFollow = false   // 用于标记当前是否跟单
  var reStartPwd = null      // 用于记录重启密码

Entwurf eines Auftragssynchronisationsmanagementsystems auf Basis der FMZ-Quantifizierung (2)

Fügen Sie dann interaktive Steuerelemente auf der Strategiebearbeitungsseite hinzu, um die Strategie anzuhalten/neu zu starten (dadurch wird der eigentliche Handel nicht gestoppt, sondern nur die Logik angehalten, die Ausführung von Aufträgen beendet und nichts anderes getan). Beim Pausieren können Sie ein Pausenkennwort festlegen, sodass Sie auch dann, wenn Sie Ihren erweiterten API-Schlüssel haben,订单同步管理系统类库(Single Server)Selbst ein echter Account kann Ihre Strategie nicht ins Leben rufen. Geben Sie beim Neustart des Kopierhandels das voreingestellte Passwort ein, um die Kopierhandelsfunktion zu aktivieren. Implementierungscode der zugehörigen Funktionen:

  ...
            // 判断交互指令
            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. Sie können die Bestellmenge angeben oder nach oben oder unten skalieren Fügen Sie der Strategie Parameter hinzu:

Entwurf eines Auftragssynchronisationsmanagementsystems auf Basis der FMZ-Quantifizierung (2)

specifiedAmount: Gibt den Betrag der Folgebestellung an. Der Standardwert ist -1, was bedeutet, dass er nicht angegeben ist. zoomAmountRatio: Zoomen Sie entsprechend der Bestellmenge im gesendeten Signal. Das gesendete Signal lautet beispielsweise:ETH_USDT,swap,buy,1, multiplizieren Sie die Bestellmenge mit zoomAmountRatio. Der Standardwert ist -1, was keine Skalierung bedeutet.

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

Hier implementieren wir die Bestellmenge, die im empfangenen Signal befolgt werden mussZoomoderBestimmte Werte angeben

  • 3. Halten Sie den Code so prägnant wie möglich und verwenden Sie andere Vorlagenbibliotheken zur Auftragsabwicklung.

Spot-Order mit Klassenbibliothek: https://www.fmz.com/strategy/10989 Futures-Order-Bibliothek: 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
    }

Sie sehen also, für die Bestellung ist nur ein Satz nötig:$.Sell(amount)$.Buy(amount)$.OpenLong(exchange, action.ct, amount) .. Warten.

Strategiecode:

Vorherige订单同步管理系统(Synchronous Server)Der temporäre Code lautet:

Entwurf eines Auftragssynchronisationsmanagementsystems auf Basis der FMZ-Quantifizierung (2)

Jetzt mit der Neugestaltung beginnen订单同步管理系统(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)
    }
}

prüfen

Dieses Mal wird für das Konto mit den Bestellungen zum Testen das Binance-Echtkonto verwendet, und für das Echtkonto zum Kopieren der Bestellungen wird das OKEX-Konto verwendet. Wir verwenden immer noch die im vorherigen Artikel verwendete Testfunktion (订单同步管理系统类库(Single Server)In der VorlagemainFunktion).

Entwurf eines Auftragssynchronisationsmanagementsystems auf Basis der FMZ-Quantifizierung (2)

Wir haben einfach die Transaktionsrichtung auf Leerverkäufe und das Transaktionsvolumen auf 0,003 geändert (auf Binance USDT basierende Verträge können Aufträge in Dezimalzahlen erteilen). Das OKEX-Konto muss jedoch eine Ganzzahl sein (OKEX-Börsenaufträge müssen in ganzen Zahlen erteilt werden), daher gebe ich die Strategieparameter anspecifiedAmountist 1.

Entwurf eines Auftragssynchronisationsmanagementsystems auf Basis der FMZ-Quantifizierung (2)

订单同步管理系统类库(Single Server)Die Testfunktion löst eine echte Transaktion aus.

Entwurf eines Auftragssynchronisationsmanagementsystems auf Basis der FMZ-Quantifizierung (2)

Die Echtzeitstrategie zum Kopieren von Aufträgen empfängt das Signal und führt die Kopieraktion aus:

Entwurf eines Auftragssynchronisationsmanagementsystems auf Basis der FMZ-Quantifizierung (2)

Die Börse eröffnete eine entsprechende Order.

Entwurf eines Auftragssynchronisationsmanagementsystems auf Basis der FMZ-Quantifizierung (2)

Als nächstes testen wir das Schließen der Position und ändern die Auftragsrichtung in der Test-Hauptfunktion, um die Short-Position von 0,003 Kontrakten zu schließen.

Entwurf eines Auftragssynchronisationsmanagementsystems auf Basis der FMZ-Quantifizierung (2)

Führen Sie dann die echte Festplatte, die für die Auftragsannahme zuständig ist, erneut aus (订单同步管理系统类库(Single Server))。

Entwurf eines Auftragssynchronisationsmanagementsystems auf Basis der FMZ-Quantifizierung (2)

Der gleiche Vorgang wird auch durch das Kopieren der realen Bestellung ausgelöst:

Entwurf eines Auftragssynchronisationsmanagementsystems auf Basis der FMZ-Quantifizierung (2)

Richtlinienadresse: Klassenbibliothek für das Auftragssynchronisierungsmanagementsystem (Einzelserver) Synchronous Server bestellen

Der Strategieentwurf dient nur der Kommunikation und dem Lernen. Bitte ändern, anpassen und optimieren Sie ihn entsprechend den tatsächlichen Produktionsanforderungen.