Die Strategie der Ernte von Leberhackern ((2)

Schriftsteller:Kleine Träume, Erstellt: 2020-11-16 10:03:52, Aktualisiert: 2023-09-26 21:05:07

img

Die Strategie der Ernte von Leberhackern ((2)

Und dannAuf und zurückIch bin nicht derjenige, der das tut.

Die dritte Funktion, die hinzugefügt wurde:

    self.balanceAccount = function() {
        var account = exchange.GetAccount()
        if (!account) {
            return
        }
        self.account = account
        var now = new Date().getTime()
        if (self.orderBook.Bids.length > 0 && now - self.preCalc > (CalcNetInterval * 1000)) {
            self.preCalc = now
            var net = _N(account.Balance + account.FrozenBalance + self.orderBook.Bids[0].Price * (account.Stocks + account.FrozenStocks))
            if (net != self.preNet) {
                self.preNet = net
                LogProfit(net)
            }
        }
        self.btc = account.Stocks
        self.cny = account.Balance
        self.p = self.btc * self.prices[self.prices.length-1] / (self.btc * self.prices[self.prices.length-1] + self.cny)
        var balanced = false
        
        if (self.p < 0.48) {
            Log("开始平衡", self.p)
            self.cny -= 300
            if (self.orderBook.Bids.length >0) {
                exchange.Buy(self.orderBook.Bids[0].Price + 0.00, 0.01)
                exchange.Buy(self.orderBook.Bids[0].Price + 0.01, 0.01)
                exchange.Buy(self.orderBook.Bids[0].Price + 0.02, 0.01)
            }
        } else if (self.p > 0.52) {
            Log("开始平衡", self.p)
            self.btc -= 0.03
            if (self.orderBook.Asks.length >0) {
                exchange.Sell(self.orderBook.Asks[0].Price - 0.00, 0.01)
                exchange.Sell(self.orderBook.Asks[0].Price - 0.01, 0.01)
                exchange.Sell(self.orderBook.Asks[0].Price - 0.02, 0.01)
            }
        }
        Sleep(BalanceTimeout)
        var orders = exchange.GetOrders()
        if (orders) {
            for (var i = 0; i < orders.length; i++) {
                if (orders[i].Id != self.tradeOrderId) {
                    exchange.CancelOrder(orders[i].Id)
                }
            }
        }
    }

KonstruktionsfunktionenLeeksReaper()Wenn man ein Objekt erstellt, dann wird das Objekt hinzugefügt.balanceAccount()Die Funktion ist die Aktualisierung von Konto-Asset-Informationen, die Speicherungself.accountDas ist die Art und Weise, wie man ein Objekt erstellt.accountEigenschaften: Zeitbereinigung des Ertragswerts und Druck. Dann berechnen Sie den Anteil des Kontostandes (Kontostand-Bilanz) anhand der aktuellsten Konto-Asset-Informationen. Wenn die Verschiebung der Schwelle ausgelöst wird, werden Kleinanleihen ausgeglichen, so dass die Münze (Kontostand) wieder ins Gleichgewicht kommt.

Wir werden die Code für diese Funktion Satz für Satz betrachten: Zuerst die erste Satz.var account = exchange.GetAccount()Es ist eine lokale Variable, die erklärt wird.accountSie können auch die Inventor-API aufrufen.exchange.GetAccount()Die Funktion, die aktuelle Daten für das aktuelle Konto erhält, gibt einen Wert anaccountVariablen.accountWenn wir diese Variable alsnullDie Werte (z. B. Überstunden, Netzwerk- und Austauschinterface-Störungen) werden direkt zurückgegeben.if (!account){...}Hier ist ein Foto.

self.account = accountDas ist die lokale Variable.accountEs gibt eine Art von Konstruktion, bei der die Objekte mit einem Wert versehen werden.accountEigenschaften werden verwendet, um die aktuellsten Kontoinformationen in den konstruierten Objekten zu erfassen.

var now = new Date().getTime()Das erklärt eine lokale Variable.nowDas ist ein sehr einfaches System, um die Zeit und Datum Objekte in JavaScript zu rufen.getTime()Die Funktion gibt den aktuellen Zeitfenster zurück.nowDie Variablen.

if (self.orderBook.Bids.length > 0 && now - self.preCalc > (CalcNetInterval * 1000)) {...}Dieser Code entscheidet, ob der aktuelle Zeitfenster und der letzte eingegebene Zeitfenster unterschiedlich sind, wenn die Parameter überschritten werden.CalcNetInterval * 1000Das bedeutet, dass es seit der letzten Aktualisierung mehr als 20 Millionen neue Benutzer gibt.CalcNetInterval * 1000Millimeter SekundeCalcNetIntervalSekunden), um die Funktion des zeitlich gedruckten Gewinns zu realisieren, da der Gewinn bei der Berechnung mit dem Preis für den Kauf einer Rechnung berechnet wird, ist die Bedingung auch begrenzt.self.orderBook.Bids.length > 0Diese Bedingung (deep data, in der Bezahlliste muss gültige Klassifizierungsinformationen vorhanden sein) wird ausgeführt, wenn diese Bedingung ausgelöst wirdself.preCalc = nowAktualisieren Sie die Variablen der Zeitleiste für die letzte Druckleistungself.preCalcZeit für die GegenwartnowHier wird die Gewinnstatistik mit der Netto-Wert-Methode berechnet, die alsvar net = _N(account.Balance + account.FrozenBalance + self.orderBook.Bids[0].Price * (account.Stocks + account.FrozenStocks))Das heißt, man tauscht die Währung in Geld um, je nach dem aktuellen Kaufpreis (Bilanzwährung), und summiert die Anzahl der Geldmengen im Konto mit der lokalen Variablen, die der Erklärung zugewiesen werden.net◦ Beurteilen, ob sich die aktuelle Gesamtnetznutzen mit den letzten aufgezeichneten Übereinstimmungen decken:

            if (net != self.preNet) {
                self.preNet = net
                LogProfit(net)
            }

Wenn das nicht stimmt,net != self.preNetWir haben es geschafft.netEigenschaften, die zur Erfassung von Nettowerte verwendet werden, werden aktualisiertself.preNetUnd dann drucken Sie das hier.netDie Gesamtrente-Daten zu den Erfindern der Quantitative Trading-Plattform-Roboter auf der Ertragskurve-Grafik ((kann in der FMZ API-Dokumentation abgerufen werden)LogProfitDie Funktion ist hier:

Wenn Sie keine zeitlich festgelegten Einnahmen ausdrucken, gehen Sie mit dem folgenden Prozess fort, um die Ergebnisse zu ermitteln:account.StocksDie Zahl der verfügbaren Münzen für das Aktienkontoaccount.Balance(Menge, die auf dem Konto zur Verfügung steht)self.btcself.cny❖ Berechnen Sie die Verzerrungsquoten und geben Sie den Wert anself.p

self.p = self.btc * self.prices[self.prices.length-1] / (self.btc * self.prices[self.prices.length-1] + self.cny)

Der Algorithmus ist auch sehr einfach: Der aktuelle Wert der Münze wird als Prozentsatz des Nettowertes des Kontos berechnet.

Wie kann man dann entscheiden, wann man das Gleichgewicht der Währung (Position) auslöst? Die Autoren buffern hier mit 50% nach oben und 2 Prozentpunkte nach unten und überschreiten die Balance der Bufferzone-Ausführung, d.h.self.p < 0.48Die Währungsbilanzverschiebung wird ausgelöst, wenn man glaubt, dass die Währung knapp ist, und beginnt mit dem Kauf einer Position in der Börse, wobei der Preis bei jedem Kauf um 0.01 steigt, und platziert drei Kleinanzeigen.self.p > 0.52Wenn Sie denken, dass Sie mehr haben, dann verkaufen Sie eine Kleinanzeige.Sleep(BalanceTimeout)Ich habe mich in der Nähe von einem Hotel aufgehalten, wo ich ein paar Tage lang war.

        var orders = exchange.GetOrders()                  # 获取当前所有挂单,存在orders变量
        if (orders) {                                      # 如果获取当前挂单数据的变量orders不为null
            for (var i = 0; i < orders.length; i++) {      # 循环遍历orders,逐个取消订单
                if (orders[i].Id != self.tradeOrderId) {
                    exchange.CancelOrder(orders[i].Id)     # 调用exchange.CancelOrder,根据orders[i].Id取消订单
                }
            }
        }

Die vierte Funktion, die hinzugefügt wurde:

Der Kern der Strategie, der Schwerpunkt, ist der Kampf gegen die Terroristen.self.poll = function() {...}Die Funktion ist die Hauptlogik der ganzen Strategie.main()Die Funktion wird ausgeführt und geht inwhileVor dem Todeszyklus benutzen wirvar reaper = LeeksReaper()Wir bauen ein Objekt für einen Safflower-Harvester, das wir dann in einemmain()Funktionszusammenrufenreaper.poll()Das ist die Funktion, die angerufen wird.

self.pollDie Funktion wird ausgeführt, einige Vorbereitungen vor jeder Runde gemacht, und die Funktion wird in der Lage sein, die Funktion zu aktivieren.self.numTick++Die Zahl der Menschen stieg.self.updateTrades()Sie aktualisieren die neuesten Marktrechnungsunterlagen und berechnen die Daten, die für die Nutzung verwendet werden.self.updateOrderBook()Die Daten werden aktualisiert und berechnet.self.balanceAccount()Sie können auch die Währungsbilanz überprüfen.

        var burstPrice = self.prices[self.prices.length-1] * BurstThresholdPct   # 计算爆发价格
        var bull = false             # 声明牛市标记的变量,初始为假
        var bear = false             # 声明熊市标记的变量,初始为假
        var tradeAmount = 0          # 声明交易数量变量,初始为0

Der nächste Schritt ist zu entscheiden, ob der aktuelle kurzfristige Markt ein Bullen oder ein Bären ist.

        if (self.numTick > 2 && (
            self.prices[self.prices.length-1] - _.max(self.prices.slice(-6, -1)) > burstPrice ||
            self.prices[self.prices.length-1] - _.max(self.prices.slice(-6, -2)) > burstPrice && self.prices[self.prices.length-1] > self.prices[self.prices.length-2]
            )) {
            bull = true
            tradeAmount = self.cny / self.bidPrice * 0.99
        } else if (self.numTick > 2 && (
            self.prices[self.prices.length-1] - _.min(self.prices.slice(-6, -1)) < -burstPrice ||
            self.prices[self.prices.length-1] - _.min(self.prices.slice(-6, -2)) < -burstPrice && self.prices[self.prices.length-1] < self.prices[self.prices.length-2]
            )) {
            bear = true
            tradeAmount = self.btc
        }

Erinnern Sie sich an den Artikel im letzten Artikel?self.updateOrderBook()Die Funktion, bei der wir eine Zeitreihe mit einem gewogenen Mittelwert erstellen, ist eine Zeitreihe, in der wir die Zeitreihe mit einem gewogenen Mittelwert erstellen.pricesArray. In diesem Code werden drei neue Funktionen verwendet._.min_.maxsliceDie drei Funktionen sind sehr gut verstanden.

  • _.minDie Funktion : ist der kleinste Wert in der Parameter-Array.

  • _.maxDie Funktion : ist der größte Wert der Array zu finden.

  • sliceDie Funktion : ist eine Mitgliedfunktion eines JavaScript-Arrayobjekts, die einen Teil der Array, der nach dem Index abgeschnitten wurde, zurückgibt, zum Beispiel:

    function main() {
        // index     .. -8 -7 -6 -5 -4 -3 -2 -1
        var arr = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
        Log(arr.slice(-5, -1))    // 会截取 4 ~ 1 这几个元素,返回一个新数组:[4,3,2,1]
    }
    

    img

Die Kriterien, nach denen ein Bär oder eine Kuh beurteilt werden kann, sind:

  • self.numTick > 2Um zu etablieren, heißt es, dass, wenn eine neue Testrunde ausbricht, mindestens drei Testrunden ausgelöst werden müssen, um zu vermeiden, dass sie zu Beginn ausgelöst werden.
  • Preisreiheself.pricesDie letzten Daten, also die aktuellsten Daten, sind die Daten vonself.pricesDie größte oder kleinste Preisdifferenz in einem vorherigen Bereich der Array muss durchbrochen werden.burstPriceDer Preis für den Ausbruch.

Wenn alle Bedingungen erfüllt sind, markieren SiebullOderbearFürtrueUnd dann geben SietradeAmountVariablenwerten, Planung von Hip-Hop-Geschäften.

Das ist ein sehr schwieriger Fall.self.updateTrades()Aktualisiert, berechnetself.volFür die ParameterBurstThresholdVolSie entscheiden, ob sie die Handelsintensität reduzieren ("die Menge der geplanten Transaktionen reduzieren").

        if (self.vol < BurstThresholdVol) {
            tradeAmount *= self.vol / BurstThresholdVol   // 缩减计划交易量,缩减为之前量的self.vol / BurstThresholdVol 倍
        }
        
        if (self.numTick < 5) {
            tradeAmount *= 0.8      // 缩减为计划的80%
        }
        
        if (self.numTick < 10) {    // 缩减为计划的80%
            tradeAmount *= 0.8
        }

Als nächstes wird beurteilt, ob ein Handelssignal oder ein Handelsvolumen den Anforderungen entspricht:

        if ((!bull && !bear) || tradeAmount < MinStock) {   # 如果非牛市并且也非熊市,或者计划交易的量tradeAmount小于参数设置的最小交易量MinStock,poll函数直接返回,不做交易操作
            return
        }

Nach dem oben genannten Urteil, die Ausführungvar tradePrice = bull ? self.bidPrice : self.askPriceEs ist möglich, dass Sie die Preise für die Transaktionen festlegen, und zwar je nachdem, ob es sich um einen Bären- oder einen Rindermarkt handelt.

Endlich geht es zu einemwhileDie einzige Bedingung, dass der Kreislauf aufhört zu springen, ist, dasstradeAmount >= MinStockDie geplante Transaktionsmenge ist kleiner als die Mindesttransaktionsmenge. Führen Sie die folgenden Befehle aus, je nachdem, ob es sich um einen Bullenmarkt oder einen Bärenmarkt handelt.orderId◎ Nach der Bestellung pro RundeSleep(200)Warten Sie 200 Millisekunden.orderIdIst wahr (wenn die Bestellung fehlschlägt und keine Order-ID zurückgegeben wird, wird die if-Bedingung nicht ausgelöst), wenn die Bedingung wahr ist.self.tradeOrderId

Erklärt eine Variable zur Speicherung von BestelldatenorderDie ursprüngliche Angabe lautetnullDer Kreislauf erhält dann die Bestelldaten dieser ID und entscheidet, ob die Bestellung in einem Push-Status ist. Wenn sie in einem Push-Status ist, löscht er die Bestellung dieser ID. Falls sie nicht in einem Push-Status ist, springt er aus dem Testkreislauf.

                var order = null           // 声明一个变量用于保存订单数据
                while (true) {             // 一个while循环
                    order = exchange.GetOrder(orderId)    // 调用GetOrder查询订单ID为 orderId的订单数据
                    if (order) {                          // 如果查询到订单数据,查询失败order为null,不会触发当前if条件
                        if (order.Status == ORDER_STATE_PENDING) {   // 判断订单状态是不是正在挂单中
                            exchange.CancelOrder(orderId)            // 如果当前正在挂单,取消该订单
                            Sleep(200)
                        } else {                                     // 否则执行break跳出当前while循环
                            break
                        }
                    }
                }

Dann führen Sie den folgenden Prozess aus:

                self.tradeOrderId = 0              // 重置self.tradeOrderId
                tradeAmount -= order.DealAmount    // 更新tradeAmount,减去提单的订单已经成交的数量
                tradeAmount *= 0.9                 // 减小下单力度
                if (order.Status == ORDER_STATE_CANCELED) {     // 如果订单已经是取消了
                    self.updateOrderBook()                      // 更新订单薄等数据
                    while (bull && self.bidPrice - tradePrice > 0.1) {   // 牛市时,更新后的提单价格超过当前交易价格0.1就减小交易力度,略微调整交易价格
                        tradeAmount *= 0.99
                        tradePrice += 0.1
                    }
                    while (bear && self.askPrice - tradePrice < -0.1) {  // 熊市时,更新后的提单价格超过当前交易价格0.1就减小交易力度,略微调整交易价格
                        tradeAmount *= 0.99
                        tradePrice -= 0.1
                    }
                }

Wenn ein Prozess ausfälltwhile (tradeAmount >= MinStock) {...}Bei diesem Zyklus ist die Ausführung des Preis-Break-Trading-Prozesses abgeschlossen. Ausführungself.numTick = 0Das heißt, umstellen.self.numTickDas ist 0.

LeeksReaper()Die Ausführung der Konstruktionsfunktion endetselfDas Objekt kehrt zurück.var reaper = LeeksReaper()Ich habe es mir vorgestellt.reaper

Bis dahinLeeksReaper()Wie die Konstruktionsfunktionen dieses Cabbage Harvester-Objekt konstruieren und die verschiedenen Methoden des Cabbage Harvester-Objekts, die Ausführungsprozesse der wichtigsten logischen Funktionen, die wir wieder analysiert haben, sollten Sie nach dem Lesen dieses Artikels ein klareres Verständnis für diesen Hochfrequenz-Strategie-Algorithmusprozess haben.


Mehr

- Ich weiß nicht.Ich möchte Ihnen sagen, ob Ihnen die Idee, eine Gemüseernte mit einem Hochfrequenz-Roboter zu kombinieren, schon durchgedreht ist?

Mattzhang1988Ich habe eine Menge Blödsinn gesagt.

Ich bin nicht sicher, ob ich das kann.Es gibt ein wenig Unklarheit, warum es notwendig ist, das Gleichgewicht von Geld und Währung zu halten, wenn das Gleichgewicht nicht erreicht wird, dann muss man kaufen und verkaufen.

Die Macht von DamaskusWo ist der Befehl unten?

- Ich weiß.In der Nebelblume, die ich zuvor gesehen habe, habe ich ein FMZ benutzt, um es noch einmal zu sehen. Monitoring von Börsenpreisschwankungen, Aufdeckung von Preisschwankungen, Trendorientierung, Berechnung des Hip-Hop-Prozentsatzes anhand des Handelsvolumens. Ich sagte es richtig, Dream General?

- Ich weiß nicht.Wie wird sich das Programm entwickeln, wenn man BalanceAccount entfernt?

- Ich weiß nicht.Dank Dreamz ist FMZ wirklich ein Schatzhaus.

PrintbtcOder Sie verstehen es nicht.

Das ist mein Sohn.BurstThresholdVol ist ein Parameter, der für die Anpassung der Volleyball-Parameter verwendet wird.

- Ich weiß nicht.Die Details sind voll, ich habe es eine Stunde lang gesehen und habe kaum Details verstanden.

RootmeWenn ich das herausfinde, dann kann ich einen Cabbage Harvester schreiben, der so aussieht wie Print Money.

Kleine TräumeIn einem Artikel von Grasshopper sagte er, dass eine hohe Frequenz ein Marktumfeld erfordert. Strategisch gesehen haben die Kohlensäure-Harvest-Maschinen und Grasshopper-Hochfrequenz-Roboter eine Idee gemeinsam.

Kleine TräumeEs tut mir leid, dass dieser Artikel hauptsächlich für Anfänger gedacht ist, aber es gibt eine Menge Blödsinn, die wirklich auffällig ist, und Sie haben es übersehen.

Kleine TräumeDas ist großartig!

Kleine TräumeDie ursprüngliche Kohlensammler hatte ein Balance-Modul, das man überlegen könnte zu entfernen.

Kleine TräumeDas ist unhöflich.

Kleine Träume- Ich weiß.

Kleine TräumeDer Ausbruch ist ein politischer Parameter, der von Menschen eingestellt wurde, und wenn man sich die Politik und den Artikel genauer ansieht, weiß man, was diese Variable kontrolliert.

Kleine TräumeDas Prinzip sollte ungefähr so sein.