Die Zukunft der digitalen Währung

Schriftsteller:Kleine Träume, Erstellt: 2021-07-02 14:35:34, Aktualisiert: 2023-09-21 21:09:56

img

Die Zukunft der digitalen Währung

In der jüngsten FMZ-Gruppe wird viel über die Martin-Strategien diskutiert, und es gibt nicht viele Martin-Strategien für digitale Währungskontrakte auf der Plattform. Daher nutzte ich die Gelegenheit, eine einfache Martin-Strategien für digitale Währungs-Futures zu entwickeln. Warum eine Martin-Strategien, da die potentielle Gefahr nicht gering ist, ist nicht vollständig nach der Martin-Strategien entworfen worden.

Der Artikel beschreibt das Lernen hauptsächlich aus dem Design von Martin-artigen Strategien, wobei die strategische Idee selbst klar ist, dass wir als FMZ-Nutzer mehr auf die Strategiegestaltung eingehen.

Zugriff auf die allgemeinen Rechte

Bei der Gestaltung einer digitalen Währungs-Futures-Strategie wird häufig auf die Gesamtrechnung zurückgegriffen. Hierbei wird die API der FMZ-Plattform angerufen.exchange.GetAccount()Es werden verfügbare Vermögenswerte und aufgelöste Vermögenswerte erfasst. Die meisten digitalen Währungs-Futures-Börsen bieten diese Dateneinheit an, aber FMZ hat keine einheitliche Verpackung für diese Eigenschaft.

Wir haben also diese Daten für verschiedene Designfunktionen von verschiedenen Börsen erhalten:

// OKEX V5 获取总权益
function getTotalEquity_OKEX_V5() {
    var totalEquity = null 
    var ret = exchange.IO("api", "GET", "/api/v5/account/balance", "ccy=USDT")
    if (ret) {
        try {
            totalEquity = parseFloat(ret.data[0].details[0].eq)
        } catch(e) {
            Log("获取账户总权益失败!")
            return null
        }
    }
    return totalEquity
}

// 币安期货
function getTotalEquity_Binance() {
    var totalEquity = null 
    var ret = exchange.GetAccount()
    if (ret) {
        try {
            totalEquity = parseFloat(ret.Info.totalWalletBalance)
        } catch(e) {
            Log("获取账户总权益失败!")
            return null
        }
    }
    return totalEquity
}

In der CodetotalEquityWir schreiben dann eine weitere Funktion als Anruf-Eingabe, um die entsprechende Funktion nach dem Namen der Börse anzurufen.

function getTotalEquity() {
    var exName = exchange.GetName()
    if (exName == "Futures_OKCoin") {
        return getTotalEquity_OKEX_V5()
    } else if (exName == "Futures_Binance") {
        return getTotalEquity_Binance()
    } else {
        throw "不支持该交易所"
    }
}

Entwerfen von Hilfsfunktionen

Vor der Gestaltung der Hauptfunktion, der Hauptlogik. Wir müssen noch einige Vorbereitungen treffen und einige Hilfsfunktionen entwerfen.

  • Löschen Sie alle aktuellen Aufzeichnungen

    function cancelAll() {
        while (1) {
            var orders = _C(exchange.GetOrders)
            if (orders.length == 0) {
                break
            }
            for (var i = 0 ; i < orders.length ; i++) {
                exchange.CancelOrder(orders[i].Id, orders[i])
                Sleep(500)
            }
            Sleep(500)
        }
    }
    

    Diese Funktion ist sicherlich für alle, die sich regelmäßig mit dem Strategie-Problem-Code auf dem FMZ-Strategiesquare beschäftigen, vertraut. Viele Strategien haben eine ähnliche Konstruktion verwendet.

  • Unterbestellung von Futures

    function trade(distance, price, amount) {
        var tradeFunc = null 
        if (distance == "buy") {
            tradeFunc = exchange.Buy
        } else if (distance == "sell") {
            tradeFunc = exchange.Sell
        } else if (distance == "closebuy") {
            tradeFunc = exchange.Sell
        } else {
            tradeFunc = exchange.Buy
        }
        exchange.SetDirection(distance)
        return tradeFunc(price, amount)
    }
    
    function openLong(price, amount) {
        return trade("buy", price, amount)
    }
    
    function openShort(price, amount) {
        return trade("sell", price, amount)
    }
    
    function coverLong(price, amount) {
        return trade("closebuy", price, amount)
    }
    
    function coverShort(price, amount) {
        return trade("closesell", price, amount)
    }
    

    Für den Futures-Handel gibt es vier Richtungen: OpenLong, OpenShort, CoverLong und CoverShort. Deshalb haben wir vier Auftragsfunktionen entwickelt, um diese Operationen zu berücksichtigen. Wenn man nur auf Auftragsbestellungen denkt, dann gibt es einige notwendige Faktoren: Richtung, Auftragspreis, Auftragsmenge. So haben wir auch ein Projekt entwickelt:tradeDie Funktion, die es zu behandeln hat, wenn方向(distance)下单价格(price)下单量(amount)Die meisten von ihnen sind in der Lage, ihre Handlungen zu verändern. Die Funktion wird von den folgenden Funktionsbereichen (OpenLong, OpenShort, CoverLong, CoverShort) angerufen:tradeFunktionen erfüllen ihre eigentliche Funktion, d.h. sie werden in einer bestimmten Richtung, Preis oder Menge an Futures-Börsen ausgeführt.

Hauptfunktion

Die strategische Idee ist einfach: Verkaufsgegenstände unterhalb einer bestimmten Entfernung zum aktuellen Preis auf der Basislinie hängen lassen, Kauf- und Verkaufsbestellungen unterhalb einer bestimmten Entfernung auf der Basis des aktuellen Preises hängen lassen.

  • Anfangsarbeit Wir brauchen zwei globale Variablen, um die Bestell-ID zu erfassen.

    var buyOrderId = null
    var sellOrderId = null
    

    Die Option zur Verwendung von OKEX_V5 Analogie wird dann in den Policy-Interface-Parametern entworfen, sodass einige Bearbeitungen im Code durchgeführt werden müssen:

    var exName = exchange.GetName()    
    // 切换OKEX V5模拟盘
    if (isSimulate && exName == "Futures_OKCoin") {
        exchange.IO("simulate", true)
    }
    

    In den Interface-Parametern wurde auch die Option entworfen, alle Informationen zurückzusetzen, so dass der Code auch eine entsprechende Behandlung hat:

    if (isReset) {
        _G(null)
        LogReset(1)
        LogProfitReset()
        LogVacuum()
        Log("重置所有数据", "#FF0000")
    }
    

    Wir laufen nur einen dauerhaften Vertrag, so dass hier geschrieben ist tot, sondern nur als ein dauerhafter Vertrag eingerichtet.

    exchange.SetContractType("swap")
    

    Dann müssen wir auch die Frage der Preispräzision und der Präzision der Bestellung berücksichtigen, die bei fehlerhaften Einstellungen verloren geht, bei der strategischen Berechnung verloren geht, und wenn viele Datenfiguren vorhanden sind, können sie bei der Bestellung leicht von der Interface der Börse abgelehnt werden.

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

    Einfache Datenwiederherstellung

    if (totalEq == -1 && !IsVirtual()) {
        var recoverTotalEq = _G("totalEq")
        if (!recoverTotalEq) {
            var currTotalEq = getTotalEquity()
            if (currTotalEq) {
                totalEq = currTotalEq
                _G("totalEq", currTotalEq)
            } else {
                throw "获取初始权益失败"
            }
        } else {
            totalEq = recoverTotalEq
        }
    }
    

    Sie können die Parameter einstellen, wenn Sie den ursprünglichen Konto-Gesamtrecht beim Ausführen der Politik angeben möchten.totalEqWenn der Parameter auf -1 gesetzt ist, liest die Strategie die gespeicherten Gesamtrechte-Daten aus. Wenn keine gesammelten Gesamtrechte-Daten gespeichert sind, wird mit der aktuell gelesenen Gesamtrechte als ursprünglicher Gesamtrechte des Strategienlauffortschritts gesprochen.

  • Hauptlogik Nachdem die anfängliche Arbeit abgeschlossen war, kam es schließlich zu den wichtigsten logischen Teilen der Strategie, und um es einfacher zu machen, habe ich die Anweisungen direkt in den Code-Notizen geschrieben.

      while (1) {                                  // 策略主要逻辑设计为一个死循环
          var ticker = _C(exchange.GetTicker)      // 首先读取当前行情信息,主要用到最新成交价
          var pos = _C(exchange.GetPosition)       // 读取当前持仓数据
          if (pos.length > 1) {                    // 判断持仓数据,由于这个策略的逻辑,是不太可能同时出现多空持仓的,所以发现同时出现多空持仓就抛出错误
              Log(pos)
              throw "同时有多空持仓"                  // 抛出错误,让策略停止
          }
          // 根据状态而定
          if (pos.length == 0) {                    // 根据持仓状态做出不同操作,pos.length == 0是当没有持仓时
              // 未持仓了,统计一次收益
              if (!IsVirtual()) {
                  var currTotalEq = getTotalEquity()
                  if (currTotalEq) {
                      LogProfit(currTotalEq - totalEq, "当前总权益:", currTotalEq)
                  }
              }
    
              buyOrderId = openLong(ticker.Last - targetProfit, amount)       // 挂开多仓的买单
              sellOrderId = openShort(ticker.Last + targetProfit, amount)     // 挂开空仓的卖单
          } else if (pos[0].Type == PD_LONG) {   // 有多头持仓,挂单位置、数量有所不同
              var n = 1
              var price = ticker.Last
              buyOrderId = openLong(price - targetProfit * n, amount)
              sellOrderId = coverLong(pos[0].Price + targetProfit, pos[0].Amount)
          } else if (pos[0].Type == PD_SHORT) {   // 有空头持仓,挂单位置、数量有所不同
              var n = 1
              var price = ticker.Last
              buyOrderId = coverShort(pos[0].Price - targetProfit, pos[0].Amount)
              sellOrderId = openShort(price + targetProfit * n, amount)
          }
    
          if (!sellOrderId || !buyOrderId) {   // 如果有一边挂单失败就取消所有挂单,重来
              cancelAll()
              buyOrderId = null 
              sellOrderId = null
              continue
          } 
    
          while (1) {  // 挂单完成,开始监控订单
              var isFindBuyId = false 
              var isFindSellId = false
              var orders = _C(exchange.GetOrders)
              for (var i = 0 ; i < orders.length ; i++) {
                  if (buyOrderId == orders[i].Id) {
                      isFindBuyId = true 
                  }
                  if (sellOrderId == orders[i].Id) {
                      isFindSellId = true 
                  }               
              }
              if (!isFindSellId && !isFindBuyId) {    // 检测到买卖单都成交了
                  cancelAll()
                  break
              } else if (!isFindBuyId) {   // 检测到买单成交
                  Log("买单成交")
                  cancelAll()
                  break
              } else if (!isFindSellId) {  // 检测到卖单成交
                  Log("卖单成交")
                  cancelAll()
                  break
              }
              LogStatus(_D())
              Sleep(3000)
          }
          Sleep(500)
      }
    

Die ganze Logik und das Design ist erklärt.

Wiederholung

Ich möchte, dass die Strategie einmal die Situation vom 19. Mai durchlebt.

img

img

Wie man sieht, sind die Martin-Art-Strategien immer noch mit Risiken verbunden.

Spielen Sie mit OKEX V5 simuliert

img

Die Strategie ist unter:https://www.fmz.com/strategy/294957

Die Strategie ist vor allem für das Lernen, aber das Gold und Silber sind sehr vorsichtig ~!


Verwandt

Mehr

Lisa20231Ich möchte Sie um etwas bitten. if (!isFindSellId &&!isFindBuyId) { // Beobachtet, dass alle Bestellungen abgewickelt wurden Werden bei der Aufspürung von Bestellungen Fehler gemacht, wenn man gleichzeitig einen Kauf- und Verkaufsbefehl mit einem schnellen Stecker auf und ab ab abschließt?

Neo1898Die andere Frage ist, ob der Kontraktmodell vollständig oder einzeln eingerichtet ist.

Neo1898Warum ist denn nicht ein zweigeteilter Vertrag vereinbart, wenn der Vertrag geschlossen ist?

Leichte WolkenIch habe es endlich von Anfang bis Ende verstanden. Dann lernte ich, aufzuhängen und zu überwachen, dann schrieb ich einen zwei-seitigen Martin. Ich bin ein großer Freund von dir.

hk Menge/upload/asset/1a9ebf427c4e2cbf1c327.png False true im Austausch?

Der Traum ist achtstellig.Wenn

Der Traum ist achtstellig.Eigentümerrechte zusammengenommen

NullMuss man die Schäden stoppen?

BtcrobotMartin, ich habe es zurückgezogen und es ist 0.

WqyAlso, wenn wir die Anzahl der Aufrufe nicht verstehen, dann ist n immer gleich 1.

Ich habe ihn gesehen.Ist die Strategie mehrfach geöffnet oder einzeln?

Kleine TräumeEs wird keine Fehler gemacht. Es wird immer noch alle Aufschlüsse stornieren, aus dem aktuellen Kreislauf springen und die Logik fortsetzen. Im Augenblick, in dem die Transaktionen abgeschlossen sind, ist es gleichbedeutend mit einem Preisdifferenzgewinn.

Kleine TräumeDie meisten von ihnen sind in der Nähe des Hauses.

Kleine TräumeDer Hebel kann anhand der eigenen Risikopräferenzen an der Börse festgelegt werden.

Kleine TräumeDie Wolken sind 666!

Kleine TräumeWenn die Variable isFindBuyId heißt, ist sie nicht richtig.

Kleine TräumeDiese Strategie ist nicht entworfen, um den Verlust zu stoppen.

Kleine TräumeHa-ha, das ist Martins Zuhause. Der Artikel ist hauptsächlich eine Lehrstrategie, die nicht viel Aufmerksamkeit verdient.

Kleine TräumeDas N ist für spätere Änderungen, z. B. n mal Abstandsverlagerung, die vorübergehend als 1 festgelegt werden kann.

Kleine TräumeIch bin nicht derjenige, der die Tür öffnet.