FMZ-Qualitätsplattform-Strategie Schreiben von Anfänger-Tutorials (Must See)

Schriftsteller:Das Gras, Erstellt: 2019-08-13 17:47:27, Aktualisiert: 2021-08-06 10:29:46

[TOC] Dieses Tutorial beinhaltet ein grundlegendes Wissen über das Schreiben von Strategien, einschließlich API-Einführungen, Reviews, Diagramme usw. Nach dem Erlernen dieses grundlegenden Tutorials wird der Benutzer in der Lage sein, die grundlegenden APIs geschickt zu verwenden, um stabile Festplattenstrategien zu schreiben.FMZ-Erfinder nutzen die Quantitative Plattform 。

Die alten Tutorials:Erfinderquantifizieren (FMZ.COM) Strategien vollständig mit Handbuch 2.0 (Tutorial)In diesem Tutorial finden Sie eine Liste mit vielen Indexposts, die Sie sich ansehen sollten.

Erste Anleitung zur Strategie

Einführung der API

Programmatisierte Transaktionen sind Programme, die sich über APIs mit den Börsen verbinden, um automatisch zu kaufen oder zu verkaufen oder andere Funktionen zu realisieren, wie sie entworfen wurden. APIs werden als Application Programming Interface bezeichnet.

Derzeit gibt es zwei Interfaceprotokolle für digitale Währungsaustausch: REST und Websocket. Der REST-Protokoll muss nur einmal zugegriffen werden, um jedes Mal Daten zu erhalten.

{"data:{"buy":"11351.73","high":"11595.77","last":"11351.85","low":"11118.45","open":"11358.74","quoteVol":"95995607137.00903936","sell":"11356.02","time":1565593489318,"vol":"3552.5153"}}

Hier sehen Sie die aktuellen Märkte für den Handel mit BTC_USDT-Paaren, die sich bei jeder Aktualisierung ändern.market=Anschließend werden spezifische Transaktionsparameter angezeigt, die modifiziert werden können, um andere Transaktionsparameter zu erhalten. Für öffentliche Interfaces, wie Marktmärkte, können alle darauf zugreifen, so dass keine Verifizierung erforderlich ist, und einige Interfaces wie die folgenden Anträge und die Erfassung von Konten erfordern die Identifizierung des Benutzers, bei denen die API-KEY zur Signierung benötigt wird.

Die FMZ-Quantitätshandelsplattform umfasst die REST-Interface der verschiedenen Börsen und verwendet einheitliche Anrufe und Datenformate, um die Erstellung von Strategien einfacher und allgemeiner zu machen. Die FMZ-Plattform bietet eine einfache Unterstützung für Websockets, die in den folgenden Tutorials erläutert wird.

Verschiedene Programmiersprachen

Die FMZ-API-Dokumentation basiert zum größten Teil auf JavaScript, allerdings gibt es aufgrund der Verpackung kaum Unterschiede zwischen den verschiedenen Sprachen, man muss nur auf grammatische Probleme achten. C++ ist etwas speziell und in den folgenden Tutorials wird eine spezielle Einführung gegeben. Weil Js relativ einfach ist und keine Kompatibilitätsprobleme aufweist, empfiehlt sich die Verwendung für Neulinge.

Da es verschiedene Versionen von Python gibt, kann man zu Beginn des Programms spezifizieren, wie z.B.#!Python2,#!Python3Hier ist der Code von Python und Javascript, der die gleichen Funktionen aufweist. Es gibt nur die unterschiedliche Syntax, daher wird in der API-Dokumentation nur ein Beispiel von Javascript angegeben, wobei auch die speziellen Anwendungsfälle von Python berücksichtigt werden.

#python代码
def main():
    while True:
        Log(exchange.GetAccount().Balance)
        Sleep(2000)
#相应的Js代码
function main(){
    while(true){
        Log(exchange.GetAccount().Balance)
        Sleep(2000)
    }
}

Ressourcenempfehlungen

Debugging-Tools

Die FMZ-Qualitätsplattform bietet Debugging-Tools für Debugging-API-Schnittstellen, die von den Benutzern bereitgestellt werden.https://www.fmz.com/m/debugDie Debugging-Tools unterstützen nur JavaScript und können nur zeitweilig ausgeführt werden, ohne dass eine Festplatte erstellt werden muss. Die zurückgegebenen Daten werden als Ergebnis zurückgegeben und der Code der Debugging-Tools wird nicht gespeichert.img

Strategische Prozessarchitektur

Die Besonderheit ist, dass es eine Main-Funktion geben muss, die wie ein normales Programm in derselben Reihenfolge ausgeführt wird. Da eine Strategie ununterbrochen ausgeführt werden muss, wird in der Regel ein Lauf und eine Ruhezeit benötigt. Da die Frequenz der Zugriffe auf alle API-Transaktionen begrenzt ist, muss die Ruhezeit entsprechend angepasst werden.

Andere Funktionen, die eine besondere Rolle spielen, sind:

  • onexit ((() ist eine normalen Ausstiegs-Funktion mit einer maximal 5 Minuten langen Ausführung, die nicht erklärt werden kann, wenn eine Überzeit einen Interrupt-Fehler auslöst.
  • Onerror (() ist eine Funktion, die für einen Ausfall aussteigt und eine maximale Ausführungsdauer von 5 Minuten hat.
  • Für die Initialierung der Funktion wird die Politik beim Start automatisch aufgerufen und kann nicht erklärt werden.
function onTick(){
   var ticker = exchange.GetTicker()
   var account = exchange.GetAccount()
    //在这里写策略逻辑,将会每6s调用一次
}
function main(){
    while(true){
        onTick()
        Sleep(6000)
    }
}

In dem vorherigen Beispiel kann die Politik direkt abgebrochen werden, wenn ein Fehler beim Netzzugriff auftritt. Wenn man eine ähnliche Strategie wie das Auto-Restart-System wünscht, die nicht abgebrochen wird, kann die Festplattenstrategie den Fehlerhalter-Loop mit try catch zulassen. Natürlich wird nur empfohlen, dies zu tun, wenn die Strategie stabil ist, sonst werden alle Fehler nicht wiedergegeben und es ist schwierig, die Politik zu sortieren.

function onTick(){
   var ticker = exchange.GetTicker()
   var account = exchange.GetAccount()
    //在这里写策略逻辑,将会每6s调用一次
}
function main(){
    try{
        while(true){
           onTick()
           Sleep(6000)
       }
    }catch(err){
        Log(err)
    }
}

Einführung der API

Börsen und Handelspare

Bei Anrufen einer beliebigen Exchange-bezogenen API ist es notwendig, die Exchange und das Handelspärchen eindeutig zu definieren.exchangeDas ist ein Objekt.exchange.GetTicker()Das Ergebnis ist ein Marktticker für diese Börse - ein Handelspaar.

Die FMZ-Plattform unterstützt das gleichzeitige Hinzufügen von mehreren Exchange-Trading-Paaren, z. B. BTC und ETH, die auf demselben Exchange-Konto gleichzeitig betrieben werden können, sowie BTC und ETH, die auf demselben Exchange-Konto gleichzeitig betrieben werden können.exchangesDie Arrays werden in der Reihenfolge angegeben, in der sie erstellt wurden.exchanges[0]exchanges[1]... und so weiter.BTC_USDTDie erste ist BTC, die Handelswährung, und die zweite ist USDT, die Preiswährung.

img

Offensichtlich ist dies problematisch, wenn wir viele Paare betreiben, und Sie können jetzt Paare mit SetCurrency wechseln, wie z.B.exchange.SetCurrency("BTC_USDT")Ich bin nicht derjenige.exchangeDie verknüpften Transaktionen werden inBTC_USDTDas wird bis zum nächsten Anruf des Wechselpaares gelten.Bitte beachten Sie, dass die neuesten Tests für die Unterstützung von Wechselpaaren unterstützt werden.Hier ist ein konkretes Beispiel.

var symbols = ["BTC_USDT", "LTC_USDT", "EOS_USDT", "ETH_USDT"]
var buyValue = 1000
function main(){
  for(var i=0;i<symbols.length;i++){
      exchange.SetCurrency(symbols[i])
      var ticker = exchange.GetTicker()
      var amount = _N(buyValue/ticker.Sell, 3)
      exchange.Buy(ticker.Sell, amount)
      Sleep(1000)
  }
}

Zugriff auf öffentliche Schnittstellen, wie z.B.

Wie bereits erwähnt, sind Marktinterfaces in der Regel öffentlich zugänglich. Die üblichen Marktinterfaces sind: Marktticker, Tiefentiefe, K-Line-Records, Transaktionsprotokolle und Trades.

Die meisten Schnittstellen habenInfoFeld, das die ursprünglichen Datenstränge darstellt, die die Börse zurückgibt, kann für zusätzliche Informationen verwendet werden, die zuvor analysiert werden mussten, JavaScript verwendetJSON.parse()In Python wird die json-Library verwendet.TimeDas Feld zeigt die Uhrzeit der Anfrage an, die verwendet werden kann, um zu bestimmen, ob die Anfrage verzögert wurde.

Es ist möglich, dass der Zugriff auf die API-Schnittstelle auf der Festplatte fehlschlägtnullPython ist zurück.NoneEs ist sehr wichtig, Fehler zu zulassen, da die Daten, die verwendet werden, Fehler verursachen und die Festplatte zum Stillstand bringen.

GetTicker

Der Zugang zum aktuellen Markt ist wahrscheinlich die am häufigsten verwendete Schnittstelle, die Informationen zum letzten Handelspreis, zum Kauf- und Verkaufspreis, zum jüngsten Handelsaufkommen usw. anzeigt.{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}

function main() {
    var ticker = exchange.GetTicker()
    Log(ticker) //在调试工具中 return ticker 。可以看到具体的结果。
    Log('上次成交价: ',ticker.Last, '买一价: ', ticker.Buy)
}

GetDepth

Die GetTicker-Lösung enthält zwar einen Kauf- und Verkaufsprozess, aber wenn man einen tieferen Kauf- und Verkaufsprozess abfragt, kann man mit dieser Schnittstelle im Allgemeinen die Top-200-Lösungen abrufen. Die Schlagpreise können mit dieser Schnittstelle berechnet werden.

{
    "Info":null,
    "Asks":[
        {"Price":5866.38,"Amount":0.068644},
        {"Price":5866.39,"Amount":0.263985},
        ......
        ]
    "Bids":[
        {"Price":5865.13,"Amount":0.001898},
        {"Price":5865,"Amount":0.085575},
        ......
        ],
    "Time":1530241857399
}

Ein Beispiel für die Nutzung von Deep Access-Gutscheinen:

function main() {
    var depth = exchange.GetDepth()
    Log('买一价个: ', depth.Bids[0].Price, '卖一价格: ', depth.Asks[0].Price)
}

GetRecords

Die K-Leitung kann nicht angegeben werden. Die Länge der K-Leitung steigt im Laufe der Zeit, bis zu 2000 Bits, wenn man zum ersten Mal etwa 200 Bits anruft (verschiedene Börsen kehren unterschiedlich zurück). Die letzte K-Leitung ist die neueste K-Leitung, so dass sich die Daten ständig ändern, wobei die erste K-Leitung die älteste ist.

exchange.SetMaxBarLen(Len)Es ist möglich, die Anzahl der ersten K-Linien zu setzen (einige Börsen unterstützen dies) und die maximale Anzahl von K-Linien zu setzen.Das ist ein Beispiel:exchange.SetMaxBarLen(500)

GetRecords kann Perioden angeben: PERIOD_M1:1 Minuten, PERIOD_M5:5 Minuten, PERIOD_M15:15 Minuten, PERIOD_M30:30 Minuten, PERIOD_H1:1 Stunden, PERIOD_D1:1 Tage.exchange.GetRecords(PERIOD_M1)◦ Nach dem Upgrade des neuesten Trustees werden die benutzerdefinierten Perioden unterstützt, die Sekundenzahlen der Perioden direkt als Parameter übertragen werden, die benutzerdefinierten Minuten auf der Ebene werden nach einer K-Linie von 1 Minute und einer K-Linie von unter 1 Minute durch GetTrades () zusammengestellt, und die Kommoditäts-Futures werden nach einem Ticksynthese zusammengestellt.Achten Sie darauf, dass Sie ähnliche Dinge im Tutorial sehen.PERIOD_M1Diese Variablen sind von der FMZ-Standardeinstellung abhängig und können von den Interessenten selbst aufgenommen werden, um ihre spezifischen Werte zu verwenden.

Ein Beispiel für die Rückgabe von Daten:

[
    {"Time":1526616000000,"Open":7995,"High":8067.65,"Low":7986.6,"Close":8027.22,"Volume":9444676.27669432},
    {"Time":1526619600000,"Open":8019.03,"High":8049.99,"Low":7982.78,"Close":8027,"Volume":5354251.80804935},
    {"Time":1526623200000,"Open":8027.01,"High":8036.41,"Low":7955.24,"Close":7955.39,"Volume":6659842.42025361},
    ......
]

Ein Beispiel für eine K-Linie:

function main(){
    var close = []
    var records = exchange.GetRecords(PERIOD_H1)
    Log('total bars: ', records.length)
    for(var i=0;i<records.length;i++){
        close.push(records[i].Close)
    }
    return close
}

GetTrades

Die Bereitstellung von Transaktionsdaten für einen bestimmten Zeitrahmen (nicht eigene Transaktionsdaten) wird von einigen Börsen nicht unterstützt.

Zugang zu einem Konto für Transaktionen

Diese Schnittstellen sind nicht direkt zugänglich, da sie mit einem Konto verknüpft sind und eine API-KEY-Signatur benötigen.

GetAccount Erhalten Sie ein Konto

Erhalten von Kontoinformationen. Eine der am häufigsten verwendeten Schnittstellen, die vor der Bestellung aufgerufen werden muss, um zu vermeiden, dass der Kontostand nicht ausreicht.{"Stocks":0.38594816,"FrozenStocks":0,"Balance":542.858308,"FrozenBalance":0,"Info":{}}Hierbei handelt es sich um den Handelswährungssaldo des Handelspares, den FrozenStocks, den Frostsaldo der nicht abgewickelten Bestellungen, den Balance, den Frostsaldo der Preiswährung, und den FrozenBalance.BTC_USDTIn der Regel wird der Name "Stocks" für BTC und "Balance" für USDT verwendet.

Beachten Sie, dass die zurückgegebenen Ergebnisse die Ergebnisse der angegebenen Transaktionspaare sind, die Informationen für andere Währungen im Transaktionskonto sind im Info-Feld, um mehrere Transaktionspaare zu bearbeiten und nicht mehrere Aufrufe zu benötigen.

Eine Plattform, die ständig den Wert der aktuellen Transaktionen anhand des Gesamtwerts ausdruckt:

function main(){
    while(true){
        var ticker = exchange.GetTicker()
        var account = exchange.GetAccount()
        var price = ticker.Buy
        var stocks = account.Stocks + account.FrozenStocks
        var balance = account.Balance + account.FrozenBalance
        var value = stocks*price + balance
        Log('Account value is: ', value)
        LogProfit(value)
        Sleep(3000)//sleep 3000ms(3s), A loop must has a sleep, or the rate-limit of the exchange will be exceed
        //when run in debug tool, add a break here
    }
}

Kaufen und bezahlen

Sie können sich anrufen.exchange.Buy(Price, Amount)Oderexchange.Buy(Price, Amount, Msg),Price ist Preis,Amount ist Menge,Msg ist eine zusätzliche String, die im Festplattenprotokoll angezeigt werden kann, nicht notwendig.null, um nach dem Status der Bestellung zu fragen.

Wenn man den Marktpreis bezahlen will, ist der Preis -1, der Betrag ist der Bestellwert, wie z.B.exchange.Buy(-1, 0.5)Das ist der Deal.ETH_BTCEinige Börsen unterstützen keine Marktpreise und Futures-Rückprüfungen.

Die Präzisionsanforderungen für alle Preise und Mengen der Teiltransaktionen sind verfügbar_N()Die Präzisionsfunktion wird kontrolliert. Für Futures-Handelsgeschäfte haben Buy und Sell eine andere Bedeutung, die separat beschrieben wird.

Ein Beispiel, wie man einen Kauf zum entsprechenden Preis macht:

function main(){
    while(true){
        var ticker = exchange.GetTicker()
        var price = ticker.Sell
        if(price >= 7000){
            exchange.Buy(_N(price+5,2), 1, 'BTC-USDT')
            break
        }
        Sleep(3000)//Sleep 3000ms
    }
    Log('done')
}

Verkaufen

Unterverkaufsschreiben. === Parameter === Parameter === Parameter === Parameter === Parameter === Parameter === Parameter === Parameter ===exchange.Sell(-1, 0.2)Das bedeutet, dass die Bank für den Marktpreis von 0,2 ETH verkauft wird.

GetOrder erhält Bestellungen

Erhalten Sie Bestellinformationen auf Basis der Bestell-ID.exchange.GetOrder(OrderId),OrderId ist die Order-id, die bei der Bestellung zurückgegeben wird.Achten Sie auf die Art der BestellungTypeFeld und BestellstatusStatusDie tatsächlichen Werte sind Zahlen, die verschiedene Bedeutungen repräsentieren, aber für die Erinnerung schädlich sind.StatusDas ist gleich 0.ORDER_STATE_PENDINGAlle diese globalen Konstanten sind in der Dokumentation zu sehen.Die Ergebnisse:

{
    "Id":125723661, //订单id
    "Amount":0.01, //订单数量
    "Price":7000, //订单价格
    "DealAmount":0, //已成交数量
    "AvgPrice":0, //成交均价
    "Status":0, // 0:未完全成交, 1:已成交, 2:已撤单
    "Type":1,// 订单类型,0:买单, 1:卖单
    "ContractType":"",//合约类型,用于期货交易
    "Info":{} //交易所返回原始信息
    }
}

Eine Strategie zum Kauf einer bestimmten Anzahl von Währungen:

function main(){
    while(true){
        var amount = exchange.GetAccount().Stocks
        var ticker = exchange.GetTicker()
        var id = null
        if(5-amount>0.01){
            id = exchange.Buy(ticker.Sell, Math.min(5-amount,0.2))
        }else{
            Log('Job completed')
            return //return the main function, bot will stop
        }
        Sleep(3000) //Sleep 3000ms
        if(id){
            var status = exchange.GetOrder(id).Status
            if(status == 0){ //这里也可以用 status == ORDER_STATE_PENDING 来判断。
                exchange.CancelOrder(id)
            }
        }
    }
}

GetOrders: Auftragsbestellungen

Erhält aktuelle Transaktionen für eine Liste aller ausstehenden Bestellungen. Wenn keine ausstehenden Bestellungen vorhanden sind, kehrt eine leere Array zurück.

Ein Beispiel, wie man aktuelle Transaktionen für alle Bestellungen widerrufen kann:

function CancelAll(){
    var orders = exchange.GetOrders()
    for(var i=0;i<orders.length;i++){
        exchange.CancelOrder(orders[i].Id) // cancel order by orderID
    }
}
function main(){
    CancelAll()
    while(true){
        //do something
        Sleep(10000)
    }
}

CancelOrder Zurückziehen

Die Bestellung wurde nach der Bestell-ID zurückgezogen.exchange.CancelOrder(OrderId)Bitte beachten Sie, dass die Bestellung bereits vollständig abgewickelt ist und dass die Rücknahme fehlschlägt.

Futures und dauerhafte Verträge

Die Funktionen von Spot-Trading gelten für Futures und Single-Future-Trading. Bevor Sie digitale Futures-Futures-Programmiert-Trading durchführen, sollten Sie sich mit den manuellen Operationen auf der Website vertraut machen und die Grundkonzepte wie Eröffnung, Ausgleich, Vollbesetzung, Eintritt, Hebel, Ausgleich, Schwankungsgewinn, Sicherungsbetrag und die entsprechenden Berechnungsformeln verstehen.

Die Definition von Flexibilisierungs- und Futures-Kontrakten unterscheidet sich jedoch durch die Tatsache, dass sie nicht gleichzeitig mehrere Räume halten.

Wenn die Börse gleichzeitig Futures-Kontakt-Futures wie OKEX und Huobi-Futures unterstützt, müssen die OKEX-Futures-Futures und die Huobi-Futures-Futures separat in der Börsenoberfläche ausgewählt werden.

SetContractType Einrichten von Verträgen

Der erste Schritt beim Futures-Trading ist die Einstellung des zu handelnden Kontracts, z. B. OKEX Futures, bei der Erstellung von Live- oder Retrospective-Trading-Paaren, die BTC-Paare auswählen, und die Einstellung des Kontracts für die Woche, die nächste Woche oder das Quartal.invalid contract typeIm Gegensatz zu den gegenwärtigen Geschäften werden Futures-Kontrakte häufig mit Handelswährungen wie BTC als Sicherung gehandelt. Der Handel mit einem BTC-Zusatzzweiß wird normalerweise für BTC_USD-Geschäfte mit BTC als Sicherung gehandelt.Nach der Einrichtung des Handelspaares müssen auch bestimmte Kontraktarten wie dauerhaft, in derselben Woche, in der nächsten Woche usw. eingestellt werden. Nach der Einrichtung des Vertrages können Akquisitions-, Kauf- und Verkaufsaktionen durchgeführt werden.

Es gibt Konten, bei denen es sich um USDT handelt, und Konten, bei denen es sich um Bitcoins, OKEX, HuobiDM, etc. handelt, die beim Hinzufügen von Festplattenkontrakten unterschieden werden müssen.

//OKEX期货
exchange.SetContractType("swap")        // 设置为永续合约
exchange.SetContractType("this_week")   // 设置为当周合约
exchange.SetContractType("next_week")   // 设置为次周合约
exchange.SetContractType("quarter")     // 设置为季度合约

//HuobiDM
exchange.SetContractType("this_week")   // 设置为当周合约 
exchange.SetContractType("next_week")   // 设置为次周合约
exchange.SetContractType("quarter")     // 设置为季度合约
exchange.SetContractType("swap")        // 设置为永续合约

//币安期货
exchange.SetContractType("swap")   // 设置为永续合约,注意币本位和USDT本位都存在永续
exchange.SetContractType("quarter")   // 设置为当季合约
exchange.SetContractType("next_quarter")  // 设置为次季合约

//BitMEX
exchange.SetContractType("XBTUSD")    // 设置为永续合约
exchange.SetContractType("XBTM19")  // 具体某个时间结算的合约,详情登录BitMEX查询各个合约代码

//GateIO
exchange.SetContractType("swap")      // 设置为永续合约,不设置默认为swap永续合约。 

//Deribit
exchange.SetContractType("BTC-27APR18")  // 具体某个时间结算的合约,详情参看Deribit官网。

GetPosition ist ein Lager.

Erhalten Sie eine Liste der aktuellen Lagerinformationen, die OKEX (OKCOIN) Futures mit einem Parameter anzeigen können, der die Art des zu erhaltenden Vertrags angibt. Wenn keine Lagerbestände vorhanden sind, wird die leere Liste zurückgegeben.[]Die Informationen, die in den Händen gehalten werden, werden wie folgt zurückgegeben:

Datentypen Variablennamen Erläuterung
Gegenstand Informationen Die ursprüngliche Struktur der Börse zurück
Zahl Marginallevel Die Hebelgröße, OKCoin ist 10 oder 20, OK Futures-Gesamthandelsmodell kehrt zu einem festen 10, da die native API nicht unterstützt wird
Zahl Betrag Haltungsvolumen, OKCoin zeigt den Anteil an den Verträgen an (ganz und über 1)
Zahl Gefrierter Betrag Anzahl der Lagerstätten
Zahl Preis Vermögenswerte
Zahl Marge Einfrieren der Sicherheiten
Zahl Gewinn Kommoditäts-Futures: Haltbarkeitsmarktverlust, digitale Währung: ((Digitale Währungseinheit: BTC/LTC, traditionelle Futurseinheit: RMB, Hinweis: OKCoin-Futures beziehen sich auf die Realisierung von Überschüssen bei Vollhandelsgeschäften, nicht auf Haltbarkeitsverlust, im Einzelhandel auf Haltbarkeitsverlust)
Verhaltensweise Typ PD_LONG für mehrere Positionen (CTP mit closebuy_today), PD_SHORT für leere Positionen (CTP mit closeesell_today), PD_LONG_YD für mehrere Positionen von gestern (CTP mit closebuy), PD_SHORT_YD für leere Positionen von gestern (CTP mit closeesell)
String Vertragstyp Kommoditäts-Futures als Vertragskode, Aktien als Börsencode _ Aktiencode als Aktiencode, spezifische Parameter SetContractType
function main(){
    exchange.SetContractType("this_week");
    var position = exchange.GetPosition();
    if(position.length>0){ //特别要注意引用前要先判断position长度再引用,否则会出错
        Log("Amount:", position[0].Amount, "FrozenAmount:", position[0].FrozenAmount, "Price:",
            position[0].Price, "Profit:", position[0].Profit, "Type:", position[0].Type,"ContractType:", position[0].ContractType)
    }
}

Futures werden aufgelöst.

Zuerst müssen Sie die Höhe des Hebels einstellen, wie man ihn anruft:exchange.SetMarginLevel(10)Das bedeutet, dass Sie 10 Mal den Leverage haben, und die Leverage-Größe, die Sie unterstützen, wird von der entsprechenden Börse angezeigt.Achten Sie darauf, dass das Hebel auf der Börse gesetzt wird, und dass es in der Code mit der Börse übereinstimmt, sonst wird ein Fehler auftreten.Auch wenn Sie nicht bereit sind, verwenden Sie den Standard-Lever. Dann setzen Sie die Transaktionsrichtung ein und rufen:exchange.SetDirection(Direction), entspringt der Offene Position, ** im Gegensatz zu Futures, wenn ein dauerhafter Vertrag nicht gleichzeitig mehrere Leerstände hält, d.h. keine einzelnen Positionen zulässt, werden mehrere Leerstände automatisch platziert, alle müssen nur gesetzt werdenbuyundsellEs ist möglich. Wenn Sie eine zweiseitige Lagerhaltung unterstützen, müssen Sie die Einstellung "Sichern" einstellen.closebuy,closebuy◦** Konkrete Beziehungen:

Operationen Parameter für SetDirection Unterordnungsfunktionen
Mehr Lager Wechsel.SetDirection ((kaufen) Austausch.Kauf()
Mehrfach Lager Wechsel.SetDirection ((closebuy) Austausch.Verkauf
Öffneten Lager Wechsel.SetDirection ((verkaufen)) Austausch.Verkauf
Flächige Lagerhallen Wechsel.SetDirection ((close-sell) Austausch.Kauf()

Schließlich gibt es spezifische Opening-Planting-Codes, bei denen die Anzahl der Einträge unterschiedlich ist, z. B. Huobi-Futures sind nach der Anzahl der Aufträge, eine auf 100 USD.

function main(){
    exchange.SetContractType("this_week")    // 举例设置 为OKEX期货 当周合约
    price = exchange.GetTicker().Last
    exchange.SetMarginLevel(10) //设置杠杆为10倍 
    exchange.SetDirection("buy") //设置下单类型为做多 
    exchange.Buy(price+10, 20) // 合约数量为20下单 
    pos = exchange.GetPosition()
    Log(pos)
    Log(exchange.GetOrders()) //查看是否有未成交订单
    exchange.SetDirection("closebuy"); //如果是永续合约,直接设置exchange.SetDirection("sell")
    exchange.Sell(price-10, 20)
}

Hier ist ein konkretes Beispiel für eine Strategie, bei der alle Positionen ausgeglichen werden.

function main(){
    while(true){
        var pos = exchange.GetPosition()
        var ticker = exchange.GetTicekr()
        if(!ticker){
            Log('无法获取ticker')
            return
        }
        if(!pos || pos.length == 0 ){
            Log('已无持仓')
            return
        }
        for(var i=0;i<pos.length;i++){
            if(pos[i].Type == PD_LONG){
                exchange.SetContractType(pos[i].ContractType)
                exchange.SetDirection('closebuy')
                exchange.Sell(ticker.Buy, pos[i].Amount - pos[i].FrozenAmount)
            }
            if(pos[i].Type == PD_SHORT){
                exchange.SetContractType(pos[i].ContractType)
                exchange.SetDirection('closesell')
                exchange.Buy(ticker.Sell, pos[i].Amount - pos[i].FrozenAmount)
            }
        }
        var orders = exchange.Getorders()
        Sleep(500)
        for(var j=0;j<orders.length;j++){
            if(orders[i].Status == ORDER_STATE_PENDING){
                exchange.CancelOrder(orders[i].Id)
            }
        }
    }
}

Leverage für digitale Währungen

Es ist nur notwendig, in den Code zu wechseln, um in ein Leverage-Konto zu wechseln, sonst ist es wie bei einem Bargeldgeschäft.

Nutzungexchange.IO("trade_margin") wechseln Sie in den Hinterlegungsmodus, und Sie erhalten Zugriff auf die Hebel-Schnittstelle der Börse. Nutzungexchange.IO("trade_normal") wechseln Sie zum normalen Konto-Modus.

Unterstützte Börsen:

  • OKEX V3: Die Modelle von Leverage-Konten unterscheiden sich von normalen Paaren, wobei einige Paare möglicherweise nicht existieren.
  • Münze: Die Paare im Modell von Leverage-Konten unterscheiden sich von den normalen und einige Paare können nicht existieren.
  • ZB: Das Geld kann nur für QCs übertragen werden, die Hebelhandelsplattform, die Geldunabhängigkeit zwischen den verschiedenen Handelsparen, d.h. die Anzahl der QC-Münzen unter dem ETH_QC-Trading, die in BTC_QC nicht zu sehen ist
  • FCoin
  • Binance ist eine Währung.

Handelsgeschäfte mit Kommoditätsfutures

Es gibt einen großen Unterschied zwischen Commodity-Futures und Digital-Futures. Erstens sind die Handelszeiten von Commodity-Futures sehr kurz, die Digital-Futures handeln 24h; die Protokolle für Commodity-Futures sind auch nicht die übliche REST-API; die Handelsfrequenz und Anzahl der Aufschlüsse für Commodity-Futures sind begrenzt, die Digital-Futures sind sehr locker usw. Daher sind viele Bereiche, an denen Commodity-Futures gehandelt werden müssen, besonders aufmerksam.https://www.fmz.com/bbs-topic/325Die Kommoditäts-Futures-Firma fügte hinzu:https://www.fmz.com/bbs-topic/371

Die Produktiv-Futures wurden im Juni 2019 mit der Einführung der Übertragungskode beauftragt. Die Futures-Anmeldungen, die von individuellen Programmierern von individuellen Benutzern benötigt werden, (die benötigten Informationsvorlagen können in der WeChat-Gruppe oder QQ-Gruppe angezeigt werden), benötigen in der Regel 4-5 Tage, die Schritte sind mühsamer.https://www.fmz.com/bbs-topic/3860Wenn Ihr Futures-Händler nicht mehr auf der Liste ist, können Sie sich nur selbst bewerben oder bei einem unterstützten Händler neu eröffnen. Das dauert in der Regel 2 Tage. FMZ hat eine tiefgreifende Zusammenarbeit mit einigen Anbietern, z. B.https://www.fmz.com/bbs-topic/506

Dank der Vorteile der FMZ-Plattform-Architektur können Benutzer auch mehrere Futures-Accounts hinzufügen und Funktionen realisieren, die andere kommerzielle Futures-Programmierungshandelssoftware nicht erreichen kann, wie die Synthese von Hochfrequenz-Ticks.https://www.fmz.com/bbs-topic/1184

Strategischer Rahmen

Da es sich zunächst nicht um einen 24-Stunden-Trading handelt und eine Ankunft erforderlich ist, muss der Linkstatus vor dem Handel beurteilt werden.exchange.IO("status")FürtrueSie können die Anschlüsse an die Börse anzeigen. Wenn Sie nicht erfolgreich geloggt sind, rufen Sie die API an, ohne dass Sie die Login-Schaltfläche not aufgefordert haben. Sie können nach Beginn der Strategie Sleep ((2000) ein gewisses Zeitrahmen für den Anschluss geben._C(exchange.SetContractType,"MA888")Das bedeutet, dass die Landung erfolgreich ist.

Die Marktzugangs- und Handelscodes für Commodity-Futures sind die gleichen wie für digitale Währungs-Futures.

function main(){
    _C(exchange.SetContractType,"MA888") //没登陆成功是无法订阅合约的,最好重试一下
    while(true){
        if(exchange.IO("status")){
            var ticker = exchange.GetTicker()
            Log("MA888 ticker:", ticker)
            LogStatus(_D(), "已经连接CTP !")//_D获取事件
        } else {
            LogStatus(_D(), "未连接CTP !")
            Sleep(1000)
        }
    }
}

Es wird empfohlen, mit einem Commodity Futures-Buch zu handeln, wo der Code sehr einfach ist und keine aufwändigen Details benötigt werden.https://www.fmz.com/strategy/57029

function main() {
    // 使用了商品期货类库的CTA策略框架
    $.CTA(Symbols, function(st) {
        var r = st.records
        var mp = st.position.amount
        var symbol = st.symbol
        /*
        r为K线, mp为当前品种持仓数量, 正数指多仓, 负数指空仓, 0则不持仓, symbol指品种名称
        返回值如为n: 
            n = 0 : 指全部平仓(不管当前持多持空)
            n > 0 : 如果当前持多仓,则加n个多仓, 如果当前为空仓则平n个空仓,如果n大于当前持仓, 则反手开多仓
            n < 0 : 如果当前持空仓,则加n个空仓, 如果当前为多仓则平n个多仓,如果-n大于当前持仓, 则反手开空仓
            无返回值表示什么也不做
        */
        if (r.length < SlowPeriod) {
            return
        }
        var cross = _Cross(TA.EMA(r, FastPeriod), TA.EMA(r, SlowPeriod));
        if (mp <= 0 && cross > ConfirmPeriod) {
            Log(symbol, "金叉周期", cross, "当前持仓", mp);
            return Lots * (mp < 0 ? 2 : 1)
        } else if (mp >= 0 && cross < -ConfirmPeriod) {
            Log(symbol, "死叉周期", cross, "当前持仓", mp);
            return -Lots * (mp > 0 ? 2 : 1)
        }
    });
}

CTP-Datenerfassungsmodell

Die Commodity Futures verwenden den CTP-Protokoll, bei dem alle Märkte und Transaktionen nur nach Veränderungen benachrichtigt werden, während die Abfrage von Bestellungen, Konten und Lagerbeständen eine aktive Abfrage ist.GetTickerGetDepthGetRecordsDie Strategie kann also ohne Sleep verwendet werden. Wenn sich ein Markt ändert, werden die Tickers, Tiefen und Records aktualisiert, wobei alle Interfaces, die aufgerufen wurden, sofort zurückgegeben werden. Der aufgerufene Interface-Zustand wird als Warte-Update-Modus gesetzt, und beim nächsten Aufruf derselben Interface wird gewartet, bis neue Daten zurückgegeben werden.

Wenn Sie Daten jedes Mal erhalten möchten, können Sie sogar alte Daten in den Markt-Instant-Update-Modus wechseln.exchange.IO("mode", 0)Hier kann die Strategie nicht mehr als ereignisgetrieben geschrieben werden, sondern muss ein SLEEP-Ereignis hinzugefügt werden, um einen schnellen Todeszyklus zu vermeiden. Einige weniger häufige Strategien können dieses Modell verwenden, wobei die Strategieentwicklung einfach ist.exchange.IO("mode", 1)Sie können den Cache-Modus von vornherein umschalten.

Bei der Handhabung einzelner Kontrakte kann der Standardmodus verwendet werden. Wenn es sich jedoch um mehrere Kontrakte handelt, kann es vorkommen, dass ein Kontrakt keine Marktaktualisierungen erhält, was zu einem Blockade der Marktinterface führt und andere Kontrakte keine Marktaktualisierungen erhalten.exchange.IO("wait")■ Wenn mehrere Börsenobjekte hinzugefügt werden, was in der Kommoditäts-Futures-Branche selten ist, kann verwendet werden.exchange.IO("wait_any")Der Index, der zurückgegeben wird, zeigt den Index der zurückgegebenen Börse an.

Die Situation tick-Veränderung:{Event:"tick", Index:交易所索引(按实盘上交易所添加顺序), Nano:事件纳秒级时间, Symbol:合约名称}Die Bestellungen werden hier geliefert:{Event:"order", Index:交易所索引, Nano:事件纳秒级时间, Order:订单信息(与GetOrder获取一致)}

Die Strategiestruktur kann in folgenden Formulierungen geschrieben werden:

function on_tick(symbol){
    Log("symbol update")
    exchange.SetContractType(symbol)
    Log(exchange.GetTicker())
}

function on_order(order){
    Log("order update", order)
}

function main(){
    while(true){
        if(exchange.IO("status")){ //判断链接状态
            exchange.IO("mode", 0)
            _C(exchange.SetContractType, "MA888")//订阅MA,只有第一次是真正的发出订阅请求,接下来都是程序切换,不耗时间。
            _C(exchange.SetContractType, "rb888")//订阅rb
            while(true){
                var e = exchange.IO("wait")
                if(e){
                    if(e.event == "tick"){
                        on_tick(e.Symbol)
                    }else if(e.event == "order"){
                        on_order(e.Order)
                    }
                }
           }
        }else{
            Sleep(10*1000)
        }
    }
}

Unterschiede zwischen Kommoditäts-Futures und digitalen Währungen

Es ist auch zu beachten, dass sich Commodity Futures von den digitalen Währungsaustauschs unterscheiden. Wie GetDepth gibt es tatsächlich nur eine Tiefe (die 5-Depth-Gebühr ist teuer), GetTrades erhält auch keine Transaktionsgeschichte (alle simuliert auf Basis von Lagerveränderungen, keine echten Transaktionsprotokolle).

Vertragsabschluss

exchange.IO("Instruments"): Gibt eine Liste aller an der Börse vertretenen Kontrakte {Kontraktname: Details} in der Wörterbuchform zurück.exchange.IO("products"): Die Liste aller Produkte der Börse {Produktname: Details} in der Wörterbuchform zurück, nur für die Festplatte unterstützt.exchange.IO("subscribed"): Rückgabe von bereits abonnierten Märkten, in gleichem Format und nur für den echten Markt.

Die traditionellen CTP-FuturesContractTypeDas bedeutet, dass die ID des Vertrags groß und klein geschrieben ist.exchange.SetContractType("au1506")❖ Die detaillierten Informationen des Vertrags werden nach erfolgreichem Auftrags-Setup zurückgegeben, wie zum Beispiel, wie viel man mindestens einmal kauft, die Gebühren, die Lieferzeiten usw. ❖ Bei mehreren Verträgen wird nur das erste Mal eine echte Abonnementanfrage gesendet, und dann wird nur auf der Code-Ebene wechseln, ohne Zeit zu verlieren. ❖ Die wichtigsten kontinuierlichen Verträge sind Code 888 wie MA888, kontinuierliche Indexverträge wie 000 wie MA000, 888 und 000 unterstützen nur die Wiederholung von virtuellen Verträgen, die Festplatte unterstützt nur die Erfassung von Transaktionen. ❖Aber die Maschinensprache kann die Hauptkontrakte bedienen, und die Programme wechseln automatisch die Positionen, d.h. sie lösen die nicht-Hauptpositionen aus und eröffnen neue Positionen auf den Hauptpositionen.

Ein erfolgloser Anmeldevorgang kann den Vertrag nicht einrichten, aber er kommt sofort zurück, so dass Sie mit _C erneut versuchen können, um zu wissen, dass die CTP-Anmeldung abgeschlossen ist. Ein erfolgreicher Anmeldevorgang ist nicht zeitaufwändig und erzeugt keinen echten Netzzugriff.

Eröffnung und Abschluss

SetDirectionSie können die DIRECTIONbuy, closebuy, sell, closesellVier Parameter, mehr Kommoditätsfuturesclosebuy_todayundclosesell_todayIch bin der Ansicht, dass es sich hier um eine Situation handelt, in der wir uns befinden.closebuy/closesellFür ein Flexible Futures kann der zweite Parameter für CTP-traditionelle Futures 1 oder 2 oder 3 Punkte festgelegt werden, die jeweils auf Spekulationen, Gewinnspielungen und Sicherungen bezogen sind, ohne die Standardspekulationen festzulegen.Die spezifischen Operationen wie Kauf-, Verkauf, Positionseinstellung, Auftragseinstellung, Abzug, Kontoeröffnung und Futures in digitalen Währungen sind die gleichen wie in den vorherigen Kapiteln.

Operationen Parameter für SetDirection Unterordnungsfunktionen
Mehr Lager Wechsel.SetDirection ((kaufen) Austausch.Kauf()
Mehrfach Lager Wechsel.SetDirection ((closebuy) Austausch.Verkauf
Öffneten Lager Wechsel.SetDirection ((verkaufen)) Austausch.Verkauf
Flächige Lagerhallen Wechsel.SetDirection ((close-sell) Austausch.Kauf()

Das folgende Beispiel ist eine spezifische Placement-Funktion. Beachten Sie, dass dieses Beispiel zu einfach ist, und eine Reihe von Fragen berücksichtigen, wie man eine Neuanmeldung anlegt, ob es sich um eine Transaktionszeit handelt, wie man eine nicht vollständige Transaktion durchführt, wie groß die maximale Auftragszahl ist, ob die Frequenz zu hoch ist, ob es sich um einen Gleitpreis oder einen Aufschlag handelt.In den meisten Fällen werden die Anwendungen von Plattformen, in denen die Plattform eingebunden ist, von der Plattform abhängig gemacht.https://www.fmz.com/strategy/12961In der Kategorie "Klassenbibliothek" finden Sie eine Einführung, die Sie empfehlen, den Quellcode zu erlernen.

function Cover(contractType, amount, slide) {
    for (var i = 0; i < positions.length; i++) {
        if (positions[i].ContractType != contractType) {
            continue;
        }
        var depth = _C(e.GetDepth);
        if (positions[i].Type == PD_LONG || positions[i].Type == PD_LONG_YD) {
            exchange.SetDirection(positions[i].Type == PD_LONG ? "closebuy_today" : "closebuy");
            exchange.Sell(depth.Bids[0]-slide, amount, contractType, positions[i].Type == PD_LONG ? "平今" : "平昨", 'Bid', depth.Bids[0]);
        } else {
            exchange.SetDirection(positions[i].Type == PD_SHORT ? "closesell_today" : "closesell");
            exchange.Buy(depth.Asks[0]+slide, amount, contractType, positions[i].Type == PD_SHORT ? "平今" : "平昨", 'Ask', depth.Asks[0]);
        }
    }
}

Commodity Futures unterstützen die Anpassung von Bestelltypen (Festplatte unterstützt, Retest nicht unterstützt), die nach der Anzeige angegeben werden und nach der Anzeige_Anzeige hinzugefügt werden, z. B.

exchange.SetDirection("buy_ioc");
exchange.SetDirection("sell_gtd-20170111")

Die konkreten Konsequenzen sind:

  • ioc sofort abgeschlossen, ansonsten wird THOST_FTDC_TC_IOC zurückgezogen
  • gfs Dieser Abschnitt gilt als THOST_FTDC_TC_GFS
  • gfd gültig an diesem Tag
  • gtd gültig vor dem angegebenen Datum
  • gtc gültig vor der Widerruf
  • gfa Gesamtanbieter wirksam THOST_FTDC_TC_GFA

Ein einfaches Interface

Die CTP-Schnittstelle ist bei den Commodity-Futures-Händlern standardmäßig eingeschaltet und kann bei Bedarf an die E-Commerce-Schnittstelle gewechselt werden. Über FMZ ist die Verpackung und die Anrufe gleich. Der Unterschied besteht darin, dass Konten, Aufträge und Bestände im Push-Modus sind, so dass die Treuhänder diese Daten vor Ort pflegen und sofort zurückkehren, wenn die entsprechende Schnittstelle aufgerufen wird, ohne dass tatsächlich eine Anfrage ausgegeben wird.

Die E-Commerce-Vereinbarung definiert die Art der Bestellungen wie folgt:

  • TAPI_ORDER_TIMEINFORCE_GFD gilt für diesen Tag
  • TAPI_ORDER_TIMEINFORCE_GTC ist gültig, bevor gtc widerrufen wird
  • TAPI_ORDER_TIMEINFORCE_GTD ist vor dem angegebenen Datum gültig
  • Fak wird teilweise abgewickelt und der Rest wird zurückgezogen TAPI_ORDER_TIMEINFORCE_FAK
  • ioc wird sofort abgeschlossen, sonst wird TAPI_ORDER_TIMEINFORCE_FAK widerrufen
  • fok konnte keine vollständige Transaktion durchführen, alle TAPI_ORDER_TIMEINFORCE_FOK wurden zurückgezogen

Häufig verwendete globalen Funktionen

Log-Logs und WeChat-Pushes

In der Desktop-Oberfläche Log ein Log, nach der String ein @-Zeichen hinzugefügt wird, wird die Nachricht in die Push-Warteschlange geschickt, die direkt nach dem Binden von WeChat oder Telegram geschickt wird.Log('推送到微信@')

Die Farbe des Logs kann auch angepasst werden.Log('这是一个红色字体的日志 #ff0000')#ff0000Für die 16 Vorläufe der RGB-Farben

Alle Log-Dateien befinden sich in der sqlit-Datenbank auf der Festplatte im Verzeichnis, in dem sich der Administrator befindet. Sie können mit der Datenbanksoftware heruntergeladen und geöffnet werden, oder sie können zum Kopieren und Erstellen von Backups verwendet werden (dasselbe Datenbankname wie die Festplatten-ID).

LogProfit druckt Erträge

Erträge werden aufgezeichnet, und die Ertragskurve wird in der Festplattenoberfläche gezeichnet, die auch beim Wiederaufladen der Festplatte gespeichert werden kann.LogProfit(1000)Achtung.LogProfitDie Parameter müssen nicht unbedingt ein Ergebnis sein, sondern können beliebige Zahlen sein, die selbst ausgefüllt werden müssen.

LogStatus-Status-Fenster zeigt (mit Tabelle)

Festplattenzustand, da Log-Logs zuerst gespeichert werden und ständig aktualisiert werden, kann verwendet werden, wenn eine nicht gespeicherte Information nur angezeigt werden mussLogStatusDie Funktion.LogStatusDie Parameter der Tabelle sind Strings und können auch für Tabelleninformationen verwendet werden.

Ein Beispiel für eine Tabelle, in der die Statuspositionen der einzelnen Festplatten angezeigt werden:

var table = {type: 'table', title: '持仓信息', cols: ['列1', '列2'], rows: [ ['abc', 'def'], ['ABC', 'support color #ff0000']]}; 
LogStatus('`' + JSON.stringify(table) + '`'); // JSON序列化后两边加上`字符, 视为一个复杂消息格式(当前支持表格) 
LogStatus('第一行消息\n`' + JSON.stringify(table) + '`\n第三行消息'); // 表格信息也可以在多行中出现 
LogStatus('`' + JSON.stringify([table, table]) + '`'); // 支持多个表格同时显示, 将以TAB显示到一组里 
LogStatus('`' + JSON.stringify(tab1) + '`\n' + '`' + JSON.stringify(tab2) + '`\n'); // 上下排列显示多个表

Schlaf Schlaf

Die Parameter sind Millisekunden.Sleep(1000)Eine Sekunde für eine Pause. Da alle Transaktionen auf die Zugriffsfrequenz beschränkt sind, ist es eine allgemeine Strategie, eine Pause in den Todeszyklus einzubeziehen.

_G Speichern von Daten

Wenn die Festplatte neu gestartet wird, wird das Programm neu gestartet._GJSON-Sortierungen können sehr einfach und praktisch verwendet werden._GDie Funktion ist inonexit()Das bedeutet, dass jedes Mal, wenn die Politik abgebrochen wird, automatisch Informationen gespeichert werden, die benötigt werden. Wenn Sie mehr formatierte Daten speichern möchten, ist die _G-Funktion nicht sehr nützlich. Sie können Python direkt in die Datenbank schreiben.

function onexit(){
    _G('profit', profit)
}
function main(){
    _G("num", 1); // 设置一个全局变量num, 值为1 s
    _G("num", "ok"); // 更改一个全局变量num, 值为字符串ok 
    _G("num", null); // 删除全局变量 num 
    _G("num"); // 返回全局变量num的值,如果不存在返回null

    var profit = 0
    if(_G('profit')){
        profit = _G('profit')
    }
}

_N Präzisionsfunktion

Bei der Bestellung, bei der Preis- und Quantitätspräzision oft kontrolliert werden, hat FMZ die eingebaute _N-Funktion, die festlegt, ob Komma-Daten gespeichert werden, wie z. B._N(4.253,2)Das Ergebnis ist 4.25.

_C Automatisierte Wiederholung

Ein Anruf der Exchange-API ist nicht garantiert, dass jeder Zugriff erfolgreich ist. _C ist eine automatisch erneute Funktion._C(exchange.GetTicker), bei dem der Default-Retestintervall 3 Sekunden beträgt, kann die _CDelay-Funktion genutzt werden, um den Retestintervall zu steuern, z. B. _CDelay ((1000), was bedeutet, dass die _C-Funktion auf 1 Sekunde geändert wird.GetTicker(),exchange.GetDepth,GetTrade,GetRecords,GetAccount,GetOrders, GetOrderAlle sind mit _C_ fehlerfrei, um zu verhindern, dass ein Zugriffsschaden zu einer Unterbrechung des Programms führt.

CancelOrderDie _C-Funktion kann nicht verwendet werden, da es verschiedene Gründe gibt, warum die Anmeldung fehlschlägt.

Die _C-Funktion kann auch Parameter übermitteln und wird auch für benutzerdefinierte Funktionen verwendet.

function main(){
    var ticker = _C(exchange.GetTicker)
    var depth = _C(exchange.GetDepth)
    var records = _C(exchange.GetRecords, PERIOD_D1) //传入参数
}

Die _Datum-Funktion

Direkt anrufen_D()Die aktuelle Zeitstring wird zurückgegeben, z. B.:2019-08-15 03:46:14│ Wenn die Wiederholung aufgerufen wird, wird die Wiederholungszeit zurückgegeben._D().slice(11) > '09:00:00':

_D(timestamp,fmt), wird das ms-Zeitfenster in eine Zeitstring umgewandelt._D(1565855310002)fmt-Parameter ist ein zeitliches Format, das standardmäßig verwendet wirdyyyy-MM-dd hh:mm:ss

TA-Indikatorfunktionen

Für einige häufig genutzte Indikatorfunktionen, wie z.B. die häufig genutzten Indikatoren MA\MACD\KDJ\BOLL, ist die FMZ-Plattform direkt integriert.

Vor der Verwendung der Indikatorfunktion ist es am besten, die K-Längen zu bestimmen. Wenn die vorhergehende K-Längenlänge nicht die erforderliche Periode erfüllen, wird das Ergebnis:nullWenn die eingegebene K-Stranglänge 100 ist und die Periode für die Berechnung von MA 10 ist, sind die ersten 9 Werte null, die nächsten werden normal berechnet.

JavaScript unterstützt auch das vollständige Talib, das als eine Dritte-Bibliothek unterstützt wird, um Anrufe wietalib.CCI(records)Hier ist ein Hinweis:http://ta-lib.org/function.html. Für Python kann man die Talib-Lebyrie selbst installieren, da sie komponiert werden muss und man nicht einfach mit Pip installieren kann, sondern selbst nach Installationsmethoden suchen kann.

Die Indikatorfunktion kann neben den K-Liniendaten auch beliebige Arrays übertragen.

function main(){
    var records = exchange.GetRecords(PERIOD_M30)
    if (records && records.length > 9) {
        var ma = TA.MA(records, 14)
        Log(ma)
    }
}

Häufige JavaScript-Funktionen

Hier sind einige der häufigsten JavaScript-Funktionen auf dem PC.

  • Date.now()Zurück zum aktuellen Zeitfenster
  • parseFloat()Wir können die Strings in Zahlen umwandeln.parseFloat("123.21")
  • parseInt()Die String wird in eine ganze Zahl umgewandelt
  • num.toString()Die Zahlen in Strings und die Zahlen in Zahlenvariablen.
  • JSON.parse()Formatieren Sie eine Json-String wieJSON.parse(exchange.GetRawJSON())
  • Javascript hat selbst Math-Library-Funktionen wieMath.max(),Math.abs()So wie häufige mathematische Operationen, siehe:https://www.w3school.com.cn/jsref/jsref_obj_math.asp
  • FMZ bezieht sich auf eine JavaScript-Drittanbieter-Math-Library.https://mathjs.org/
  • FMZ bezieht sich auf die JavaScript-Drittanalysebücherei und empfiehlt, sich darüber zu informieren.https://underscorejs.org/

Die Template-Klasse-Datei

Es gibt eine Vielzahl von Situationen, in denen man sich Gedanken machen muss, wenn man eine Strategie auf dem Markt schreiben möchte. Zum Beispiel eine so einfache Funktion wie den Kauf von 5 Münzen. Wir müssen bedenken: Ist der aktuelle Saldo ausreichend? Wie hoch ist der Preis für die Bestellung? Wie genau ist es? Ist es nicht notwendig, Bestellungen zu spalten, um den Markt zu vermeiden?

JavaScript-Klassen für digitale Währungen und Commodity-Futures sind standardmäßig integriert und müssen nicht kopiert werden.https://www.fmz.com/square/20/1❏ Kopieren und speichern Sie die Template-Klassenbüchern und wählen Sie die Klassenbüchern, die Sie verwenden möchten, wenn Sie Ihre eigenen Richtlinien erstellen.

Die JavaScript-Vorlage-Funktionen werden mit$Python begann mitextIch habe eine Frage.

Bibliothek für digitale Währungen

Der Quellcode ist:https://www.fmz.com/strategy/10989Die Implementierung einer bestimmten Funktion kann direkt auf den Quellcode verwiesen werden.

Erhalten Sie ein Konto:

$.GetAccount(e)

Log($.GetAccount()); // 获取账户信息, 带容错功能
Log($.GetAcccount(exchanges[1]));

Die folgende Rücknahme:

$.Buy/Sell(e, amount)
$.Buy(0.3); // 主交易所买入0.3个币
$.Sell(0.2); // 主交易所卖出0.2个币
$.Sell(exchanges[1], 0.1); // 次交易所卖出0.1个币
$.CancelPendingOrders(e, orderType)

$.CancelPendingOrders(); // 取消主交易所所有委托单
$.CancelPendingOrders(ORDER_TYPE_BUY); // 取消主交易所所有的买单
$.CancelPendingOrders(exchanges[1]); // 取消第二个交易所所有订单
$.CancelPendingOrders(exchanges[1], ORDER_TYPE_SELL); // 取消第二个交易所所有的卖单

Das Urteil über die Kreuzung:

$.Cross(periodA, periodB) / $.Cross(arr1, arr2);

var n = $.Cross(15, 30);
var m = $.Cross([1,2,3,2.8,3.5], [3,1.9,2,5,0.6])
如果 n 等于 0, 指刚好15周期的EMA与30周期的EMA当前价格相等
如果 n 大于 0, 比如 5, 指15周期的EMA上穿了30周期的EMA 5个周期(Bar)
如果 n 小于 0, 比如 -12, 指15周期的EMA下穿了30周期的EMA 12个周期(Bar)
如果传给Cross不是数组, 则函数自动获取K线进行均线计算
如果传给Cross的是数组, 则直接进行比较

Die Funktion "Wirtschaffung" wird von der Funktion "Wirtschaffung" verwendet.

$.withdraw(exchange, "btc", "0x.........", 1.0, 0.0001, "***")

Kommoditäts-Futures-Kategorie

Die Verwendung der Commodity Futures Trading Library ist stabil und empfohlen.https://www.fmz.com/strategy/12961Und es gibt auch andere Möglichkeiten, wie man das tun kann.

CTA-Bücher

  • Die Festplatte wird automatisch den Index auf die Hauptströmung abbilden.
  • Sie werden automatisch abgewickelt.
  • Der Re-Test kann eine Mapping wie rb000/rb888 spezifizieren, das heißt, die Transaktionen mit dem Index rb werden auf die Hauptkonjunktur abgebildet.
  • Man kann auch andere Kontrakte abbilden, wie z.B. rb000/MA888 ist die K-Linie des Rb-Index, um die Ma-Main zu handeln.
function main() {
    $.CTA("rb000,M000", function(r, mp) {
        if (r.length < 20) {
            return
        }
        var emaSlow = TA.EMA(r, 20)
        var emaFast = TA.EMA(r, 5)
        var cross = $.Cross(emaFast, emaSlow);
        if (mp <= 0 && cross > 2) {
            Log("金叉周期", cross, "当前持仓", mp);
            return 1
        } else if (mp >= 0 && cross < -2) {
            Log("死叉周期", cross, "当前持仓", mp);
            return -1
        }
    });
}

Ein Beispiel für den Aufruf einer Bibliothek

function main() {
    var p = $.NewPositionManager();
    p.OpenShort("MA609", 1);
    p.OpenShort("MA701", 1);
    Log(p.GetPosition("MA609", PD_SHORT));
    Log(p.GetAccount());
    Log(p.Account());
    Sleep(60000 * 10);
    p.CoverAll("MA609");
    LogProfit(p.Profit());
    Log($.IsTrading("MA609"));
    // 多品种时使用交易队列来完成非阻塞的交易任务
    var q = $.NewTaskQueue();
    q.pushTask(exchange, "MA701", "buy", 3, function(task, ret) {
        Log(task.desc, ret)
    })
    while (true) {
        // 在空闲时调用poll来完成未完成的任务
        q.poll()
        Sleep(1000)
    }
}

Zeichnung Bibliothek

Da die ursprüngliche Graphie-Funktion komplizierter ist, wird im folgenden Tutorial gezeigt, dass es für Neulinge empfehlenswert ist, direkt die Graphie-Datei zu verwenden, die sehr einfach ist. FMZ hat eine einfache Bibliothek eingebaut, die auf der Policy-Editing-Seite zu sehen ist.

img

Das Javascript-Präsentations-Library kann hier kopiert werden:https://www.fmz.com/strategy/27293Die Python-Druckzeilen-Klassarchive wird kopiert:https://www.fmz.com/strategy/39066

Ein Beispiel:

function main() {
    while (true) {
        var ticker = exchange.GetTicker()
        if (ticker) {
            $.PlotLine('Last', ticker.Last) //可以同时画两条线,Last是这条线的名字
            $.PlotLine('Buy', ticker.Buy)
        }
        Sleep(6000)
    }
}

Einstellung der Strategieparameter

Unter der Strategie-Editing-Seite befindet sich die Strategieparameter-Einstellung, die den globalen Variablen der Strategie entspricht und an beliebiger Stelle des Codes zugänglich ist. Die Strategieparameter können in der Festplattenoberfläche geändert werden, um bei einem Neustart wirksam zu werden. Daher können einige Variablen als Parameter festgelegt werden, ohne die Strategie zu ändern.img

  • VariablennamenDas ist eine einfache Methode, um das Problem zu lösen.
  • Beschreibung: die Namen der Parameter in der Policy-Schnittstelle, um die Bedeutung der Parameter zu verstehen.
  • AnmerkungenDetaillierte Erklärung der Parameter: Diese Beschreibung wird angezeigt, wenn die Maus auf den Parametern bleibt.
  • TypDer Typ des Parameters wird im Folgenden beschrieben.
  • Standardwert: der Standardwert für den Parameter.

Stringtypen und numerische Typen sind einfach zu verstehen und sind die am häufigsten verwendeten Typen. Ein Dropbox zeigt in der Parameteroberfläche Optionen an, wie zum Beispiel den Dropbox-SYMBOL-Parameterwert alsBTC|USDT|ETHWenn Sie USDT im Dropdown der Parameterseite wählen, ist der Wert von SYMBOL in der Strategie der Index 1 für USDT.

Die Parameter sind noch viel zu setzen.https://www.fmz.com/bbs-topic/1306

Strategie-Rückprüfung

Nach der Quantifizierung einer Strategie können Sie Ihre Strategie mit historischen Daten testen, um zu sehen, wie Ihre Strategie in den historischen Daten profitiert. Natürlich sind die Rückwertungen nur zur Referenz. Die FMZ-Quantifizierungsplattform unterstützt die Rückwertung von Kryptowährungen in den Bereichen Cash, Futures, BitMEX Fiduciary Commodities und Futures, wobei die Kryptowährungen hauptsächlich die Mainstream-Varianten unterstützen. Javascript-Retasting erfolgt im Browser, Python-Retasting muss auf dem Host durchgeführt werden, der von der Plattform zur Verfügung gestellt wird.

Wiederholung

Der onbar-Rücklauf ist auf der K-Linie basiert, wobei jede K-Linie einen Rücklauf-Zeitpunkt erzeugt, an dem Informationen wie Hoch-Niedrig-Abrechnungen, Handelsvolumen und so weiter zu der aktuellen K-Linie und vor dieser Zeitpunkt erhalten werden.


Mehr

SchnüfflerApisäure

WissenschaftWie funktioniert die Implementierung von Strategien lokal? Ich habe eine einfache Log-Ausgabe geschrieben und folge der Bewegung am Ende des Satzes. Der erste Schritt ist, mit einem Laptop als Server den Administrator zu starten. Der zweite Schritt ist das Schreiben eines einfachen Test.py-Programms, das Log-Informationen ausführt (API-Interface-Funktion für FMZ). Schritt 3: Wie am Ende des Textes schreiben Sie eine Runfile, die mit run.py aufgerufen wird und mit test.py ausgeführt wird.

Gyp9Was ist mit dem Quantified Cloud Trading Kurs, den ich gekauft habe?

Ich bin nicht derjenige, der das sagt.viele

Ich bin nicht derjenige, der das sagt.Ich bin hier.

Ich bin ein Freund von dir.Lernen

WqyEs gibt einen kleinen Schreibfehler, GetAccount erhält das Konto.

Lieutenant Yayoi.Getorder outtime, wie geht's mit der OKEX-Börse?

Ich bin ein junger Mann.Wenn Sie nicht in der Lage sind, die garantierten Anlagegebühren zu erhalten, bis zu 0% werden die garantierten Anlagegebühren gezwungen.

Schiebung 2020Ich sehe die 1 Minute k-String-Operation, also kann die Sleep-Zeit für den Python-Todzyklus auf 0.1s gesetzt werden, also sleep ((100)

Ostwindeexchange.SetDirection (("closebuy"); // Wenn es sich um einen dauerhaften Vertrag handelt, setzen Sie exchange.SetDirection (("sell") direkt ein Hier habe ich OKex-Permanente-Kontrakte ausprobiert, wenn sie auf Sell gesetzt werden, werden sie direkt frei, und das ist nicht sehr billig.

Ostwindeexchange.SetDirection (("closebuy"); // Wenn es sich um einen dauerhaften Vertrag handelt, setzen Sie exchange.SetDirection (("sell") direkt ein Hier habe ich OKex-Permanente-Kontrakte ausprobiert, wenn sie auf Sell gesetzt werden, werden sie direkt frei, und das ist nicht sehr billig.

OstwindeIn GetOrders-Code gibt es zwei Spellfehler. Eines ist, dass die Funktion in fuction geschrieben wurde, das andere in der Bedingung für den For-Loop.

OstwindeIch habe mich geirrt. exchange.Buy ((-1, 0.5), das ETH_BTC-Paar, das für den Kauf von 0,5 BTC auf der Börse steht exchange.Buy ((price, 0.5)), wenn es sich um eine solche Preisbeschränkung handelt, bedeutet, dass 0.5ETH zum Preis des Preises gekauft wird

Ostwindeexchange.Buy ((-1, 0.5), das ETH_BTC-Paar, das für den Kauf von ETH in Höhe von 0,5 BTC zum Marktpreis steht Hier sollte man sich für den Marktpreis von 0,5 ETH kaufen.

Gyp9Ich danke Ihnen.

Das GrasDas Programm ist seitdem im Internet verfügbar: https://study.163.com/course/courseMain.htm?share=2&shareId=400000000602076&courseId=1006074239&_trace_c_p_k2_=c3f5d238efc3457d93c8b92c0398d2b2

Das GrasWeChat ist ein Webseite-System, das Sie in die Gruppe bringt.

WqyWenn Sie Probleme haben, fragen Sie, ob wir eine offizielle Kommunikationsgruppe haben?

Das GrasÄndert

Das GrasWiederholung

Das GrasSie können diese Informationen mit GetRawJSON oder in einem Info-Feld anzeigen.

OstwindeIch habe viele Schreibfehler in meinem Code gefunden, haha.

Das GrasOh, das ist korrigiert, danke für die Fehler.

Das GrasEinige dauerhafte Verträge erlauben eine Bindung an zwei Wege und benötigen ein Bindungssystem. Ich habe aktualisiert, es war nur Bitmex.