Design einer Strategie zur Sicherung von Bargeld für digitale Währungen (2)

Schriftsteller:Kleine Träume, Erstellt: 2021-07-30 16:36:48, Aktualisiert: 2023-09-20 10:36:43

img

Design einer Strategie zur Sicherung von Bargeld für digitale Währungen (2)

In einem früheren Artikel haben wir gemeinsam eine einfache Hedging-Strategie implementiert, und in diesem werden wir lernen, wie wir diese aufwerten können. Die Änderung der Strategie ist nicht sehr groß, aber die Details der Änderungen müssen beachtet werden.

Die Notwendigkeit, diese Strategie zu verbessern

  • Wechseln Sie das Objekt-Leverage-Modell an der Börse Diese Änderung betrifft nur die Festplatte, und einige Bargeldgeschäfte haben alle Bargeld-Leverage-Schnittstellen, die auch auf FMZ verpackt sind. Für die direkt auf FMZ verpackte und die Bargeld-Leverage unterstützende Austauschobjekte kann der Modus direkt gewechselt werden.
  • Erhöhung der Differenz Die Zunahme der Differenz-Grafiken zeigt, weil es nur eine Zeichnung istA交易所->B交易所B交易所->A交易所Wir verwenden die horizontal Linie, die die Differenz auslöst. Wir verwenden direkt die Horizontal Linie, die die Differenz auslöst.画线类库Wir lernen hier, wie man FMZ mit einem einfachen, einfachen und benutzerfreundlichen System verarbeitet.模版类库Funktionen.
  • Einseitige Absicherung Diese Veränderung ist relativ groß, da es schwierig ist, die Differenz zwischen den beiden Börsen bei einem speziellen Hedging-Trading vollständig umzukehren. Die meiste Zeit dauert der Preis einer Börse höher als der Preis der anderen Börse. Zu diesem Zeitpunkt, wenn unsere Vermögenswerte bereits vollständig abgesichert sind (d. h. die Münzen sind auf den niedrigen Börsen und das Geld ist auf den hohen Börsen). Die Hedging ist stagniert und kann nicht mehr auf die schwankenden Profitabilität der Differenz angewiesen sein.
  • Parameter wie Interaktionsmodifizierung von Hedging-Differenzlinien Die Strategie wird interaktiv erweitert, sodass die Differenz-Trigger-Linien in Echtzeit geändert werden können.
  • Ordnen Sie die Status-Tabellen-Informationen an und zeigen Sie sie in Form eines Formulars an Die Daten, die angezeigt werden müssen, werden ordnungsgemäß angezeigt, damit sie leicht zu beobachten sind.

Wir werden die Entwürfe dann einzeln umsetzen.

Wechseln Sie das Objekt-Leverage-Modell an der Börse

Code zum Umstieg in den Cash-Leverage-Modus mit dem Ein-Deal-Real-Time-Platzexchanges[i].IOEinfügen von Parameterntrade_normalWechseln Sie zum Hebel und geben Sie eintrade_super_marginWechseln Sie zum vollen Hebelstand, Rückmessung nicht unterstützt.

In dermainDie Vorbereitungsphase für den Beginn der Funktion wird erhöht:

    // 切换杠杆模式
    for (var i = 0 ; i < exchanges.length ; i++) {   // 遍历检测所有添加的交易所对象
        if (exchanges[i].GetName() == "Binance" && marginType != 0) {   // 如果当前i索引代表的交易所对象是币安现货,并且策略界面参数marginType选择的不是「普通币币」选项,执行切换
            if (marginType == 1) {
                Log(exchanges[i].GetName(), "设置为杠杆逐仓")
                exchanges[i].IO("trade_normal")
            } else if (marginType == 2) {
                Log(exchanges[i].GetName(), "设置为杠杆全仓")
                exchanges[i].IO("trade_super_margin")
            }
        }
    }

Hier wird lediglich Code hinzugefügt, der den Leverage-Modus für den Umtausch von Binance-Kontostand in die Strategie einfügt, so dass der Umtausch in den Parametern der Strategie nur für Binance-Kontostand gültig ist.

Erhöhung der Differenz

Es ist sehr einfach, mit einer gepackten Bildermalerei zu arbeiten.画线类库Über das Programm können Sie direkt auf der FMZ-Plattform Strategie Square suchen.

img

Oder klicken Sie direkt auf den Link:https://www.fmz.com/strategy/27293Sie können sich auf die Kopie-Seite dieser Vorlage umschalten.

img

Mit einem Klick auf die Schaltfläche können Sie diese Modellklasse in Ihre eigene Policy-Library kopieren.

img

Auf der Schablonenseite der Schablonen-Editing-Politik können Sie dann in der Schablonen-Tabelle die benötigte Schablonen-Klasse auswählen. Wenn Sie die Schablonen-Klasse auswählen, wird die Schablonen-Klasse auf der Schablonen-Editing-Seite angezeigt.画线类库Ich bin der Ansicht, dass es eine gute Idee ist.

Wir lernen vor allem, wie man es benutzt.画线类库Die Funktion, die ein Diagramm zeichnet.

img

Wir haben vor,A->BDie Unterschiede zwischen den PreisenB->ADie Differenz, die Differenz-Trigger-Line, wird gezeichnet. Zwei Kurven (die Differenz von A zu B und von B zu A) und zwei horizontale Linien (die Differenz-Trigger-Line) müssen wie im obigen Bild dargestellt werden.

Wir haben die Möglichkeit, die Risiken zu überwinden, weil wir eine einseitige Absicherung entwerfen.A->BundB->ADie Auslöser sind unterschiedlich. Sie können nicht mit dem Design aus dem vorherigen Artikel verwendet werden. In einem früheren Artikel heißt es:

      var targetDiffPrice = hedgeDiffPrice
      if (diffAsPercentage) {
          targetDiffPrice = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentage
      }

Nur ein Auslöser der DifferenztargetDiffPriceDas ist nicht wahr. Also hier müssen wir den Code ändern, erst die Parameter ändern.

img

Das ist ein sehr schwieriger Fall.

        var targetDiffPriceA2B = hedgeDiffPriceA2B
        var targetDiffPriceB2A = hedgeDiffPriceB2A
        if (diffAsPercentage) {
            targetDiffPriceA2B = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageA2B
            targetDiffPriceB2A = (depthA.Bids[0].Price + depthB.Asks[0].Price + depthB.Bids[0].Price + depthA.Asks[0].Price) / 4 * hedgeDiffPercentageB2A
        }

Die Differenz wird dann von der vorherigen Differenz ausgelöst.targetDiffPriceEiner wird zu zwei.targetDiffPriceA2BtargetDiffPriceB2ADas ist nicht wahr. Dann kann man die Zeichenlinie-Funktion der Zeichenlinie-Klassenbibliothek verwenden, um diese Daten auf dem Diagramm zu zeichnen.

        // 画图
        $.PlotHLine(targetDiffPriceA2B, "A->B")  // 该函数第一个参数是水平线在Y轴方向上的值,第二个参数是显示文本
        $.PlotHLine(targetDiffPriceB2A, "B->A")

Die Strategie funktioniert, wie ein Diagramm zeigt.

img

Man zeichnet dann eine Echtzeit-Differenz-Kurve, um zu vermeiden, dass die Kurve zu viel ist. Man legt den Code der Echtzeit-Differenz-Daten-Kurve in die Balance-Detection.

        if (ts - lastKeepBalanceTS > keepBalanceCyc * 1000) {
            nowAccs = _C(updateAccs, exchanges)
            var isBalance = keepBalance(initAccs, nowAccs, [depthA, depthB])
            cancelAll()
            if (isBalance) {
                lastKeepBalanceTS = ts
                if (isTrade) {
                    var nowBalance = _.reduce(nowAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
                    var initBalance = _.reduce(initAccs, function(sumBalance, acc) {return sumBalance + acc.Balance}, 0)
                    LogProfit(nowBalance - initBalance, nowBalance, initBalance, nowAccs)
                    isTrade = false 
                }                
            }

            $.PlotLine("A2B", depthA.Bids[0].Price - depthB.Asks[0].Price)  // 画实时差价曲线
            $.PlotLine("B2A", depthB.Bids[0].Price - depthA.Asks[0].Price)  // 第一个参数是曲线名称,第二个参数是曲线当前时刻的值,即当前时刻Y轴方向上的值
        }

Das bedeutet, dass Sie nur vier Zeilen Grafik-Code verwenden können, um eine Grafik beim Ausführen der Strategie zu zeigen.

Einseitige Absicherung

Der Artikel erwähnt, dass die Differenz-Trigger-Linie in zwei Stücke umgewandelt wurde, die jeweils kontrolliert werden.A->BDie Gefahr, dass sie sich nicht mehr aufhalten, ist groß.B->ADie Annahme, dass die Preise der Anleger in einem anderen Markt als dem der Anleger in einem anderen ausgewählten Markt ausgewertet werden, ist nicht möglich.

        if (depthA.Bids[0].Price - depthB.Asks[0].Price > targetDiffPriceA2B && Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount) >= minHedgeAmount) {          // A -> B 盘口条件满足            
            var priceSell = depthA.Bids[0].Price - slidePrice
            var priceBuy = depthB.Asks[0].Price + slidePrice
            var amount = Math.min(depthA.Bids[0].Amount, depthB.Asks[0].Amount)
            if (nowAccs[0].Stocks > minHedgeAmount && nowAccs[1].Balance * 0.8 / priceSell > minHedgeAmount) {
                amount = Math.min(amount, nowAccs[0].Stocks, nowAccs[1].Balance * 0.8 / priceSell, maxHedgeAmount)
                Log("触发A->B:", depthA.Bids[0].Price - depthB.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[1].Balance * 0.8 / priceSell, nowAccs[0].Stocks)  // 提示信息
                hedge(exB, exA, priceBuy, priceSell, amount)
                cancelAll()
                lastKeepBalanceTS = 0
                isTrade = true 
            }            
        } else if (depthB.Bids[0].Price - depthA.Asks[0].Price > targetDiffPriceB2A && Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount) >= minHedgeAmount) {   // B -> A 盘口条件满足
            var priceBuy = depthA.Asks[0].Price + slidePrice
            var priceSell = depthB.Bids[0].Price - slidePrice
            var amount = Math.min(depthB.Bids[0].Amount, depthA.Asks[0].Amount)
            if (nowAccs[1].Stocks > minHedgeAmount && nowAccs[0].Balance * 0.8 / priceBuy > minHedgeAmount) {
                amount = Math.min(amount, nowAccs[1].Stocks, nowAccs[0].Balance * 0.8 / priceBuy, maxHedgeAmount)
                Log("触发B->A:", depthB.Bids[0].Price - depthA.Asks[0].Price, priceBuy, priceSell, amount, nowAccs[0].Balance * 0.8 / priceBuy, nowAccs[1].Stocks)  // 提示信息
                hedge(exA, exB, priceBuy, priceSell, amount)
                cancelAll()
                lastKeepBalanceTS = 0
                isTrade = true 
            }            
        }

Da der Kauf- und Verkaufspreis in zwei Daten gespalten ist, kann man die Hedge-FunktionhedgeIch bin nicht derjenige, der das sagt.

function hedge(buyEx, sellEx, priceBuy, priceSell, amount) {
    var buyRoutine = buyEx.Go("Buy", priceBuy, amount)
    var sellRoutine = sellEx.Go("Sell", priceSell, amount)
    Sleep(500)
    buyRoutine.wait()
    sellRoutine.wait()
}

Es gibt auch einige kleine Anpassungen, die auf diesen Änderungen basieren, die hier nicht beschrieben werden können.

Parameter wie Interaktionsmodifizierung von Hedging-Differenzlinien

Die Strategie wird interagierbar gemacht, sodass die Strategie die Differenz-Triggerlinie in Echtzeit ändern kann. Dies ist ein Designbedarf für eine semi-automatische Strategie, die hier auch als Lehrbeispiel implementiert wird. Das Interaktionsdesign der Strategie ist auch sehr einfach, indem man zunächst die Interaktionssteuerung auf der Politikeditorseite hinzufügt.

img

Zwei neue Steuerelemente wurden hinzugefügt, eine A2B und eine B2A. Wenn Sie einen Wert in das Eingabefeld des Steuerelements eingeben, klicken Sie auf die Eingabe-Taste auf der rechten Seite des Eingabefelds.123Klicken SieA2BDer Button wird sofort an die Politik geschickt.

A2B:123

Interaktionserkennung und -verarbeitung in der Strategiecode.

        // 交互
        var cmd = GetCommand()   // 每次循环执行到这里时,都检测有没有交互指令过来,没有则返回空字符串
        if (cmd) {               // 检测到有交互指令,例如:A2B:123
            Log("接收到命令:", cmd)
            var arr = cmd.split(":")   // 拆分出交互控件名称和输入框中的值,arr[0]就是A2B,arr[1]就是123
            if (arr[0] == "A2B") {     // 判断触发的交互控件是不是A2B
                Log("修改A2B的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
                if (diffAsPercentage) {
                    hedgeDiffPercentageB2A = parseFloat(arr[1])     // 修改触发差价线
                } else {
                    hedgeDiffPriceA2B = parseFloat(arr[1])          // 修改触发差价线
                }
            } else if (arr[0] == "B2A") {           // 检测到触发的控件是B2A     
                Log("修改B2A的参数,", diffAsPercentage ? "参数为差价百分比" : "参数为差价:", arr[1])
                if (diffAsPercentage) {
                    hedgeDiffPercentageA2B = parseFloat(arr[1])
                } else {
                    hedgeDiffPriceB2A = parseFloat(arr[1])
                }
            }
        }

Ordnen Sie die Status-Tabellen-Informationen an und zeigen Sie sie in Form eines Formulars an

Die Status-Tab-Daten sollen ordnungsgemäß und einfach zu beobachten sein.

        var tbl = {
            "type" : "table", 
            "title" : "数据", 
            "cols" : ["交易所", "币", "冻结币", "计价币", "冻结计价币", "触发差价", "当前差价"], 
            "rows" : [], 
        }
        tbl.rows.push(["A:" + exA.GetName(), nowAccs[0].Stocks, nowAccs[0].FrozenStocks, nowAccs[0].Balance, nowAccs[0].FrozenBalance, "A->B:" + targetDiffPriceA2B, "A->B:" + (depthA.Bids[0].Price - depthB.Asks[0].Price)])
        tbl.rows.push(["B:" + exB.GetName(), nowAccs[1].Stocks, nowAccs[1].FrozenStocks, nowAccs[1].Balance, nowAccs[1].FrozenBalance, "B->A:" + targetDiffPriceB2A, "B->A:" + (depthB.Bids[0].Price - depthA.Asks[0].Price)])

        LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")

img

Wiederholung

Die Rückmeldung ist nur eine Teststrategie, eine erste Detektionsfunktion, viele BUGs können in der Rückmeldungsphase tatsächlich getestet werden. Es ist nicht notwendig, sich um die Rückmeldung zu kümmern.

img

img

Die Strategie ist hier:https://www.fmz.com/strategy/302834


Verwandt

Mehr

15570686905Die Strategie ist, die Funktion des Vertrages zu integrieren, und das ist gut, wenn man die dauerhaften Verträge und die Ratenverträge mit einbezieht.

Leichte WolkenTypfehler: Kann die Eigenschaft 'SetPrecision' von undefined nicht lesen Die aktuelle Hedging-Strategie für verschiedene Währungen Ver1.1

Kleine TräumeIch habe die Gelegenheit, eine Lektion zu geben.

Leichte WolkenIch verstehe, danke.

Kleine TräumeEs gibt zwei Objekte, die man hinzufügen muss.