FMZ-Anfänger-Tutorial

Schriftsteller:Das Gras, Erstellt: 2019-04-09 11:29:07, Aktualisiert: 2024-02-06 17:35:38

[TOC]

img

1.Start mit der FMZ-Plattform

Dies ist eine grundlegende Anleitung für Anfänger, für eine vollständige Version unserer API-Dokumentation, überprüfen Sie aufFMZ-APIEs gibt viele offensichtliche Spezifikationen, die in diesem Tutorial nicht behandelt werden.

Nachdem Sie das gesamte Tutorial gelernt haben, werden Sie wissen, wie FMZ funktioniert und in der Lage sein, einige grundlegende Strategien zu schreiben.

1.1 Über die FMZ-Plattform

Was ist die FMZ-Plattform?

FMZ ist eine automatisierte Handelsplattform für Kryptowährungshändler mit Unterstützung für viele Bitcoin/eth/altcoin-Börsen.

Was kann FMZ für Sie tun?

Sie können lernen, wie Sie Ihre Bots schreiben ((Strategie) s von unserem Strategies Square, die viele Open Source-Code enthält, teilen Sie Ihre Strategies Code mit anderen, bitten Sie um professionelle Hilfe jederzeit, laufen Sie Ihre Strategie auf vielen Börsen, steuern Sie Ihren Bot auf der Website mit Computer oder Handy, verkaufen Sie Ihre Strategien, wenn Sie möchten, kommunizieren Sie mit vielen anderen Auto-Trading-Liebhabern in unsererGruppeMit einem Wort, FMZ ist eine perfekte Plattform für diejenigen, die automatischen Handel machen wollen.

Welche Kryptowährungsbörsen unterstützt FMZ?

FMZ unterstützt fast alle bekannten Börsen, wieBinance, Bitfinex, Bitstamp, OKEX, Huobi, Poloniex, etc. können Sie auch Futures aufOKEXundBitMEXDie vollständige Liste der Unterstützungsangebote finden Sie unterAPISie müssen nur eine Strategie schreiben und sie ohne Änderungen auf allen Börsen ausführen.

Welche Programmiersprachen unterstützt FMZ?

FMZ unterstützt JavaScript, Python, C++ (JavaScript und Python werden empfohlen) für die Codierung Ihrer Strategien.

Ist dein API-Schlüssel sicher?

Ja, Ihre API-Schlüssel werden nach der Verschlüsselung gespeichert.

  • Sie müssen das FMZ-Passwort eingeben, wenn Sie den Schlüssel hinzufügen.https.
  • Sie müssen das FMZ-Passwort eingeben, wenn Sie den Docker auf Ihrem Server oder Computer ausführen.
  • FMZ sendet den verschlüsselten Schlüssel an Ihren Docker mit https, wenn Sie einen Bot starten. Der Docker entschlüsselt den Schlüssel.
  • FMZ speichert dein Passwort nicht (nur Passwort Hash).
  • Sie müssen Ihr eigenes Passwort und Ihren Docker-Server schützen. Es ist am besten, einen zweiten Verifizierungslogin FMZ zu verwenden.

Aktuelle Funktionsliste:

  • 1.Plattformübergreifend, unterstützt alle wichtigen Kryptowährungsbörsen bald mehr
  • 2.Unterstützung des simulierten Austauschs. https://wex.app/
  • 3.Besitzt ein wirksames Simulations-Backtesting-System.
  • 4. Unterstützt das Senden von E-Mails, das Versenden von Nachrichten auf Ihr Telegrammkonto.
  • 5.Webbasierte Steuerung, die über Ihr Telefon zugänglich ist.
  • 6. Unterstützt die Programmierung mit Python\C++\JavaScript.
  • 7.Die Kosten sind extrem niedrig. 0,125 RMB pro Stunde, etwa 0,018 Dollar.
  • 8.NoDie API-Key oder Passwörter werden auf unserem Server gespeichert. FMZ läuft seit mehr als vier Jahren ohne Sicherheitsprobleme.

1.2 Ein schneller Einstieg in die FMZ-Plattform

Um einen Bot auszuführen, müssen Sie eine Strategie haben, einen Austausch hinzufügen, zuerst einen Docker bereitstellen. Der Docker ist der Exekutor Ihrer Strategie, der auf Ihrem eigenen Computer oder Server läuft.

Ein kurzer Blick auf die Hauptseite

img

  • 1. Ihre Hauptsteuerseite
  • 2.Verwalten Sie alle Ihre Bots (Start, Stop, Delete, Open usw.)
  • 3.Verwalten Sie alle Ihre Strategien Code
  • 4.Stellen Sie Ihren Docker ein und verwalten Sie ihn
  • 5.Neue Börsen hinzufügen
  • 6.Handbuchhandel an den von Ihnen hinzugefügten Börsen
  • 7. Bezahlen Sie Ihre Rechnung
  • 8.Fragen Sie hier
  • 9. Simulierter Austausch der FMZ
  • 10.Debug-Tool, mit dem Sie einen Codeblock ausführen können, ohne einen Bot zu starten.
  • 11.Alle Arten von Nachrichten
  • 12.Strategie-Feld, in dem Open-Source- und Ladestrategien aufgeführt sind
  • 13.Live Robots, in dem alle live laufenden Bots aufgeführt sind.
  • 14.Foren, in denen Sie einen Beitrag veröffentlichen können, um eine Frage zu diskutieren.
  • 15.Frage jemanden, für dich Code zu schreiben oder diese Dienstleistung für andere anzubieten.
  • 16.Produkte für Börsen und Agenturen.
  • 17.API-Dokumentation.
  • 18. Einige nützliche Werkzeuge, überprüfen Sie selbst.
  • 19. Ihre Kontoinformationen.

Ein Austausch hinzufügen

Hinzufügen beihttps://www.fmz.com/m/add-platform, oder klickenPlatformEtikett. Ihr Zugangsschlüssel und Ihr geheimer Schlüssel können an der Kryptowährungsbörse angewendet werden. API-KEY wird zum Handel und zur Erfassung der privaten Informationen von der Börse verwendet. Wir speichern keine API-Key oder Passwörter auf unserem Server. Sie können sich in FMZs registrierensimulierter Austauschund es zum Testen hinzufügen.

img

Einsatz eines Dockers

FMZ betreibt keine Bots für Sie, Sie müssen einen Docker selbst als Ausführungsbeauftragten bereitstellen, was flexibler und sicherer ist, da unser Service nicht an der Ausführung Ihrer Bots beteiligt ist.

Für Windows ist es ganz einfach, folgen Sie einfach den Anweisungen aufhttps://www.fmz.com/m/add-node

img

Für Linux können Sie einen VPS auf unserer Website mieten, der den Docker automatisch bereitstellt.

  • 1.Kaufen Sie einen Cloud-Server (VPS) bei Amazon oder Google, die niedrigste und günstigste Konfiguration genügt. Sie können oft eine lange Zeit kostenlose Testversion haben.
  • 2.Loggen Sie sich in Ihren Server ein, folgen Sie den Anweisungen Ihres Serveranbieters oder googeln Sie es.
  • 3.Wählen Sie den Docker, der Ihrer Systemversion entspricht, meistens 64Bit.
  • 4. Für Centos, laufenwget www.fmz.com/dist/robot_linux_amd64.tar.gzInstallieren Sie zuerstyum install wget -y.
  • 5.Run tar -xzvf robot_linux_amd64.tar.gzUm den Zipper zu öffnen.
  • 6.Run ./robot -s node.fmz.com/xxxxx -p -p yourFMZpasswordSie sollten etwas sehen wie2018/07/05 05:04:10 Login OK, SID: 62086, PID: 7226, Name: host.localdomainDas heißt, alles ist geregelt.node.fmz.com/xxxxxist einzigartig für jeden Benutzer, finden Sie Ihre eigenen aufhttps://www.fmz.com/m/add-node.
  • 7.Wenn der Docker nicht im Hintergrund ausgeführt wird, wird der Docker gestoppt, wenn der SHH-Client geschlossen wird. Drückenctrl + Cum den Docker zu stoppen.
  • 8.Run nohup ./robot -s node.fmz.com/xxxxx -p yourFMZpassword &Dieser Schritt kann auch durchScreen command.
  • 9. Überprüfenhttps://www.fmz.com/m/nodesWenn alles in Ordnung ist, finden Sie den Docker dort.

Schreiben Sie eine Strategie

Sie sollten Ihre eigene Strategie schreiben oder aus dem Quadrat kaufen. Hier werden wir eine einfache JavaScript-Strategie als Demo verwenden, um zu zeigen, wie Sie die Bearbeitungsseite verwenden.https://www.fmz.com/strategy/125482- Ich weiß. In diesem Tutorial wird nicht beschrieben, wie man JavaScript benutzt, da man viele Tutorials online finden kann.

img

  • 1. Bearbeiten Sie Ihren Code
  • 2.Backtesting, wir werden diesen Teil in einem Zwischen-Tutorial behandeln
  • 3. Die Programmiersprache Ihres Codes, JavaScript, wurde in dieser Demo verwendet
  • 4.Der Titel, , ist in chinesischer und englischer Sprache gegliedert.
  • 5.Die Art Ihrer Strategie, bei der der Ausfall häufig auftritt
  • 6.Die Kategorie Ihrer Strategie.Wenn Sie zu viele Strategien haben, können Sie sie in verschiedene Kategorien einteilen.
  • 7.Fernbearbeitung Ihres Codes von Ihrer eigenen IDE anstelle unserer Website
  • 8.Ein Link zum API-Dokument
  • 9.Anmerkungen zur Strategie (nur für Sie sichtbar). Sie können die Gedanken hier aufzeichnen.
  • 10.Beschreibungen der Strategie: Andere werden die Beschreibungen sehen, wenn Sie Ihre Strategie auf Square teilen oder verkaufen.
  • 11.Handbuch der Strategie, kann nur eingesehen werden, wenn jemand Ihre Strategie gekauft hat.
  • 12. Speichern Sie Ihren Code oderCtrl+Sim Bearbeitungsmodus.
  • 13. Speichern Sie die Backtest-Konfiguration auf dem Code.
  • 14.Downloaddie Strategieakten
  • 15.Die Strategie exportieren und importieren, wobei alle Parameter beibehalten werden
  • 16.Wechseln Sie die Schriftgröße und bearbeiten Sie das Thema
  • 17.Automatische Formatierung des Codes
  • 18.Verwenden Sie den VIM-Modus zum Bearbeiten.

Um die Nachricht auf Ihr Telefon zu schicken, müssen Sie das Telegramm an Ihr Konto anhttps://www.fmz.com/m/account

/*
This strategy will send a message to your telegram when the price is higher or lower than
the set price.
All strategies must have a main function as the entrance.
*/
function main() {
     //change symbol,will cover the default symbol which was set when start a bot.Currency is a strategy arguments
    exchange.IO("currency", Currency)   
    var lastPushTime = 0    //the variable of last push timestamp.
    while(true){    //run a infinite loop, which is the basic structure
        //_C() function can retry the request automatically after failure. not necessary. var ticker = exchange.GetTicker() is ok.
        var ticker = _C(exchange.GetTicker) // for information about GetTicker, check on https://fmz-docs.readthedocs.io/en/latest/code_Instruction/Market%20API.html#getticker
        if(ticker.Last > UpPrice || ticker.Last < LowPrice){    //ticker.Last represents the last deal price
            if(Date.now() - lastPushTime > 300*1000){    //only push once in 5 mins, Date.now() return ms.
                lastPushTime = Date.now()    //update lastPushTime
                Log(Currency, 'Price is: ', ticker.Last, '@')    //Log the price on the bot's page and sent the message. '@' in the end means push message
            }
        }
        Log(Currency, 'Price is: ', ticker.Last) //just log the price
        Sleep(Interval*1000)    //check the last price again after Interval seconds
    }
}

Führen Sie den Bot aus.

Endlich ist es Zeit, einen Bot zu starten. Auf derRobotSeite, klickenAdd robot, oder Besuchhttps://www.fmz.com/m/add-robotdirekt einen Bot hinzufügen.img

  • 1.Bot Name
  • 2. Der Docker, der diesen Bot ausführt
  • 3.Die Strategie zur Durchführung
  • 4.Die Parameter, der Standardwert können geändert werden.
  • 5.Standard Kline-Periode bei der Verwendung der Austausch.GetRecords()
  • 6.Exchange
  • 7.TradingSymbol oder Paare
  • 8.Wenn das Handelssymbol, das Sie benötigen, nicht auf der Liste steht, können Sie es einfach selbst eingeben.
  • 9.Clickum den Austausch hinzuzufügen
  • 10.Die Börse wurde bereits hinzugefügt.exchanges[0], exchanges[1]
  • 11.ClickUm den Roboter zu führen!

Verwalten Sie den Bot

Auf derRobotSeite, Sie können sehen, dass der Bot läuft.img

  • 1.Botname, klicken Sie hier auf die Bot-Seite.
  • 2.Strategie, die vom Bot ausgeführt wird, klicken Sie hier auf die Strategie-Seite.
  • 3.Bots Status. Kann laufen, gestoppt, Fehler.
  • 4.Bot's Gewinn, weitergegebenLogProfit(), kann jede Zahl sein, die Sie wollen.
  • 5.Erstelltes Datum kann auf die letzte Kommunikationszeit geändert werden.
  • 6.Überwachen Sie den Bot. FMZ sendet Ihnen eine Nachricht, wenn der Bot versehentlich gestoppt wurde
  • 7. Stoppen Sie den Roboter.

Klicken Sie auf den Namen des Bots auf der Bot-Seite für weitere Informationen:img

2.Die am häufigsten verwendete API-Einführung

Dieser Teil wird einige der am häufigsten verwendeten API, für eine vollständige Version unserer API-Dokumentation, überprüfen Sie aufFMZ-API- Ich weiß. Für Anfänger wird dringend empfohlen, den Demo-CodeDebug-Seite.

2.1 Protokoll

Verwenden: Log(msg) Parameter:Zeichenfolgen oder ZahlenBeschreibung:Melden Sie eine Nachricht auf der Roboterprotokollseite ein.Zurück:KeineDemo:

function main() {
    var msg = 'msg string'
    Log(msg)
    Log('hello', 'world', 123)
    Log("red color message", "#FF0000")
    Log("push this message to telegram!@") // won't push on debug page
}

2.2 GetTicker

Verwenden: exchange.GetTicker() Parameter:KeineBeschreibung:Erhalten Sie den aktuellen Markt.Zurück:

{"Info:{}, "High":5226.69, "Low":5086.37,"Sell":5210.63, "Buy":5208.5, "Last":5208.51, "Volume":1703.1245, "OpenInterest":0, "Time":1554884195976}

Demo:

function main() {
    var ticker = exchange.GetTicker()
    Log(ticker)
    Log('Last Price: ',ticker.Last, 'Bid Price: ', ticker.Buy)
}

2.3 Die Tiefe

Verwenden: exchange.GetDepth() Parameter:KeineBeschreibung:Erhalten Sie das aktuelle Auftragsbuch des Marktes.Zurück:

{
    "Info":null,
    "Asks":[
        {"Price":5866.38,"Amount":0.068644},
        {"Price":5866.39,"Amount":0.263985},
        {"Price":5866.73,"Amount":0.05},
        {"Price":5866.77,"Amount":0.05},
        {"Price":5867.01,"Amount":0.15},
        {"Price":5875.89,"Amount":0.05},
        ......
        ]
    "Bids":[
        {"Price":5865.13,"Amount":0.001898},
        {"Price":5865,"Amount":0.085575},
        {"Price":5864.15,"Amount":0.013053},
        {"Price":5863.65,"Amount":0.016727},
        {"Price":5863.51,"Amount":0.128906},
        {"Price":5863.15,"Amount":0.2}
        ......
        ],
    "Time":1530241857399
}

Demo:

function main() {
    var depth = exchange.GetDepth()
    Log(depth)
    Log('Bid one: ', depth.Bids[0].Price, 'Ask one: ', depth.Asks[0].Price)
}

2.4 GetRecords

Verwenden: exchange.GetRecords(), exchange.GetRecords(Period) Parameter:

Name Typ Zwingend Beschreibung
Dauer Weltweite Variante Nein. Klines-Zyklus, optionale Parameter, Standard-K-Zyklus wird beim Starten des Roboters eingestellt.

Alle möglichen Parameter:PERIOD_M11 Minute,PERIOD_M5Fünf Minuten.PERIOD_M1515 Minuten.PERIOD_M3030 Minuten.PERIOD_H11h,PERIOD_D11d.Beschreibung:Holen Sie Kline/Candlestick Bars für den aktuellen Markt.Zurück:

[
    {"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},
    ......
]

Demo:

//A useful JavaScript example using Records to get a close array:
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
}

2.5 GetAccount

Verwenden: exchange.GetAccount() Parameter:KeineBeschreibung:Erhalten Sie KontoinformationenZurück:

{
    "Stocks":0.38594816,// free base asset
    "FrozenStocks":0,    //locked base asset
    "Balance":542.858308,//free quote asset
    "FrozenBalance":0     //locked quote asset
    "Info":{} //the raw data
}

Demo:

//A useful JavaScript example of Log your account value for a certain trading pair:
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
    }
}

2.6 Kaufen

Verwenden: exchange.Buy(Price, Amount), exchange.Buy(Price, Amount, Msg) Parameter:

Name Typ Zwingend Beschreibung
Preis Zahl - Ja, das ist es. Kaufpreis der Limitorder
Betrag Zahl - Ja, das ist es. Kaufbetrag der Limitorder
Msg String Nein. Hinzufügen einer zusätzlichen Nachricht auf der Protokollseite

Beschreibung:Senden Sie einen Kaufbefehl und ein Kaufprotokoll auf der Seite der BotsZurück:Rückgabe der OrderID bei Erfolg,nullWenn nicht.Demo:

//A useful JavaScript example of Buy for buy certain amount of bitcoin at a certain price:
function main(){
    while(true){
        var ticker = exchange.GetTicker()
        var price = ticker.Sell
        if(price >= 7000){
            exchange.Buy(price+5, 1, 'BTC-USDT')
        }
        Sleep(3000)//Sleep 3000ms
    }
}

2.7 Verkaufen

Verwenden: exchange.Sell(Price, Amount), exchange.Sell(Price, Amount, Msg) Parameter:

Name Typ Zwingend Beschreibung
Preis Zahl - Ja, das ist es. Verkaufspreis der Limitorder
Betrag Zahl - Ja, das ist es. Verkaufsbetrag der Limitorder
Msg String Nein. Hinzufügen einer zusätzlichen Nachricht auf der Protokollseite

Beschreibung:Senden Sie einen Verkaufsbefehl und ein Verkaufsprotokoll auf der Seite der BotsZurück:Rückgabe der OrderID bei Erfolg,nullWenn nicht.Demo:

//A useful JavaScript example of Buy for buy certain amount of bitcoin at a certain price:
function main(){
    while(true){
        var ticker = exchange.GetTicker()
        var price = ticker.Buy
        if(price >= 7000){
            var id = exchange.Sell(price-5, 1, 'BTC-USDT')
            Log('OrderId: ', id)
        }
        Sleep(3000)
    }
}

2.8 GetOrder

Verwenden: exchange.GetOrder(OrderId) Parameter:

Name Typ Zwingend Beschreibung
Bestellung Zahl - Ja, das ist es. Bestellnummer

Beschreibung:Holen Sie sich die Bestelldetails nach der Bestell-ID.Zurück:

{
    "Id":125723661,
    "Amount":0.01,
    "Price":7000,
    "DealAmount":0,
    "AvgPrice":0,
    "Status":0, // 0:Not filled, 1:Filled, 2:Canceled
    "Type":1,// 0:Buy, 1:Sell
    "ContractType":"",//just for futures contract orders
    "Info":{} //raw info from exchange
    }
}

Demo:

//A JavaScript example of using this API, which will buy until your account has 5 coins:
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(10-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){
                exchange.CancelOrder(id)
            }
        }
    }
}

2.9 GetOrders

Verwenden: exchange.GetOrders() Parameter:KeineBeschreibung:Holen Sie alle offenen Aufträge für Ihre Handelssymbole.Zurück:Eine Liste offener Aufträge, das Ergebnis hat die gleiche Bedeutung wieGetOrder()

[
    {
        "Info":{},
        "Id":16387538,
        "Amount":1123,
        "Price":0.00012826,
        "DealAmount":0,
        "AvgPrice":0,
        "Status":0,
        "Type":1,
        "ContractType":""
    }
]

Demo:

//A JavaScript example of using this API, which will cancel all open orders for trading symbol:
fuction 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)
    }
}

2.10 Bestellung stornieren

Verwenden: exchange.CancelOrder(OrderId) Parameter:

Name Typ Zwingend Beschreibung
Bestellung Zahl - Ja, das ist es. Bestellnummer

Beschreibung:Stornieren Sie eine Bestellung per Bestell-ID.Zurück:bool-Typtruebedeutet, dass die Stornierung des Auftragsersuchens erfolgreich erfolgte.falsebedeutet, dass die Stornierung des Auftragsantrags fehlgeschlagen ist.

2.11 SetContractType

Verwenden: exchange.SetContractType(ContractType) Parameter:

Name Typ Zwingend Beschreibung
Vertragstyp String - Ja, das ist es. Vertragstyp

Beschreibung:Kontrakttyp für den Futures-Handel festlegen. muss zuerst festgelegt werden, bevor andere private API verwendet werden.Zurück:KeineDemo:

exchange.SetContractType("this_week") //OKEX future has “this_week”, “next_week”, “quarter” , "swap"
exchange.SetContractType("XBTUSD") //BitMEX future has "XBTUSD","XBTM19",etc

2.12 GetPosition

Verwenden: exchange.GetPosition() Parameter:KeineBeschreibung:Erhalten Sie die aktuellen Positionsinformationen, nur für den Futures-Handel.Zurück:Eine Liste der Positionen, wird eine leere Liste zurückgeben, wenn das Konto keine Position hat.Demo:

// Note: GetPosition function obtains all positions.
function main(){
    exchange.SetContractType("this_week") //for OKEX future
    var position = exchange.GetPosition()
    if(position.length>0){
        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)
    }
}

2.13 SetDirection

Verwenden: exchange.SetDirection(Direction) Parameter:

Name Typ Zwingend Beschreibung
Richtung String - Ja, das ist es. kann seinbuy, closebuy, sell, closesell.

Beschreibung:Einrichtung von Kauf- oder Verkaufsbestellungen, nur für den Futures-Handel.Zurück:KeineDemo:

function main(){
    exchange.SetContractType("this_week");
    exchange.SetMarginLevel(5) // Set the leverage to 5 times
    exchange.SetDirection("buy") // Set the order type to buy long
    exchange.Buy(5000, 2) //buy long at the price 1000, quantity of 2
    exchange.SetDirection("closebuy")
    exchange.Sell(4999, 2) //close long position
}

2.14 Andere häufig verwendete Funktionen:

Überprüfen Sie mehr Details über diese Funktionen auf FMZAPI-Dokumente

Name Beschreibung Beispiel
LogStatus Log eine Nachricht oder Tabellen auf der Statusleiste der Bots, wird jedes Mal aktualisiert LogStatus('msg')
_C Wiederholungsfunktion _C(exchange.GetRecords,PERIOD_H1),_C(exchange.GetTicker)
_N Positionsfunktion _N(4001.512,2),_N(num,0)
_G Ein globales Wörterbuch, das nach dem Neustart gespeichert werden kann. _G('initValue', 1000);_G('initValue')
_D Gibt den Zeitstempel zurück _D(), _D(1478570053241)
TA TA-Lib-Indikatorbibliothek. UnterstützungMACD, EMA, KDJUnd so weiter. TA.MACD(records)
Math Ich unterstütze die mathematische Funktion.https://mathjs.org/ Math.min(1,2), Math.sqrt(2)

3.Zwei vollständige, wirkliche Strategien

Es gibt viele Lehrstrategien inhttps://www.fmz.com/square/s:tag:Study/1Das ist einfach und einfach für Anfänger.

3.1 Hochfrequenzmarktmacher-Spotstrategie

Dies ist eine einfache, aber leistungsfähige Strategie, die in echten BTC-Spotmärkten hunderte Male verdient hat.

var floatAmountBuy = 20
var floatAmountSell = 20
var diffPrice = 3
var Interval = 3000

function CancelPendingOrders() {
    var orders = _C(exchange.GetOrders);
    for (var j = 0; j < orders.length; j++) {
        exchange.CancelOrder(orders[j].Id, orders[j])
    }
}

function GetPrice(depth) {
    var price = {buy:0, sell:0}
    var askAmount = 0
    var bidAmount = 0
    for(var i=0; i<depth.Bids.length; i++){
        askAmount += depth.Asks[i].Amount
        bidAmount += depth.Bids[i].Amount
        if(askAmount >= floatAmountBuy && !price.buy){
            price.buy = depth.Asks[i].Price
        }
        if(bidAmount >= floatAmountSell && !price.sell){
            price.sell = depth.Bids[i].Price
        }
    }
    if(!price.buy || !price.sell){
        price = {buy:depth.Asks[depth.Asks.length-1].Price, sell:depth.Bids[depth.Bids.length-1].Price}
    }
    return price
}

function onTick() {
    var price = GetPrice(_C(exchange.GetDepth))
    var buyPrice = price.buy + 0.01
    var sellPrice = price.sell - 0.01
    if ((sellPrice - buyPrice) <= diffPrice){
        buyPrice -= 10
        sellPrice += 10
    }
    CancelPendingOrders()
    var account = _C(exchange.GetAccount)
    var amountBuy = _N((account.Balance / buyPrice-0.01), 2)
    var amountSell = _N((account.Stocks), 2)
    if (amountSell > 0.02) {
        exchange.Sell(sellPrice, amountSell)
    }
    if (amountBuy > 0.02) {
        exchange.Buy(buyPrice, amountBuy)
    }
}

function main() {
    while (true) {
        onTick()
        Sleep(Interval)
    }
}

3.2 OKEX-Funktion mit doppeltem Antrieb

Eine klassische Fluchtstrategie.https://www.fmz.com/strategy/103247für Konfigurationen. Sie können lernen, wie man Funktionen austauscht und Diagramme aus dem Quellcode zeichnet.

var ChartCfg = {
    __isStock: true,
    title: {
        text: 'Dual Thrust Up-Down Track'
    },
    yAxis: {
        plotLines: [{value: 0,
            color: 'red',
            width: 2,
            label: {
                text: 'Up Track',
                align: 'center'}
                },
            {value: 0,
            color: 'green',
            width: 2,
            label: {
                text: 'Down Track',
                align: 'center'},
            }
        ]
    },
    series: [{type: 'candlestick',
        name: 'current cycle',
        id: 'primary',
        data: []
        },
        {type: 'flags',
        onSeries: 'primary',
        data: [],
        }
    ]
};

var STATE_IDLE = 0;
var STATE_LONG = 1;
var STATE_SHORT = 2;
var State = STATE_IDLE;

var LastBarTime = 0;
var UpTrack = 0;
var BottomTrack = 0;
var chart = null;
var InitAccount = null;
var LastAccount = null;
var Counter = {
    w: 0,
    l: 0
};

function GetPosition(posType) {
    var positions = exchange.GetPosition();
    for (var i = 0; i < positions.length; i++) {
        if (positions[i].Type === posType) {
            return [positions[i].Price, positions[i].Amount];
        }
    }
    return [0, 0];
}

function CancelPendingOrders() {
    while (true) {
        var orders = exchange.GetOrders();
        for (var i = 0; i < orders.length; i++) {
            exchange.CancelOrder(orders[i].Id);
            Sleep(Interval);
        }
        if (orders.length === 0) {
            break;
        }
    }
}

function Trade(currentState, nextState) {
    var pfn = nextState === STATE_LONG ? exchange.Buy : exchange.Sell;
    if (currentState !== STATE_IDLE) {
        exchange.SetDirection(currentState === STATE_LONG ? "closebuy" : "closesell");
        while (true) {
            var amount = GetPosition(currentState === STATE_LONG ? PD_LONG : PD_SHORT)[1];
            if (amount === 0) {
                break;
            }
            // pfn(amount);
            pfn(nextState === STATE_LONG ? _C(exchange.GetTicker).Sell * 1.001 : _C(exchange.GetTicker).Buy * 0.999, amount);
            Sleep(Interval);
            CancelPendingOrders();
        }
        var account = exchange.GetAccount();

        if (account.Stocks > LastAccount.Stocks) {
            Counter.w++;
        } else {
            Counter.l++;
        }

        LogProfit(_N(account.Stocks - InitAccount.Stocks), "Profit rate:", _N((account.Stocks - InitAccount.Stocks) * 100 / InitAccount.Stocks) + '%');
        LastAccount = account;
    }
    exchange.SetDirection(nextState === STATE_LONG ? "buy" : "sell");
    while (true) {
        var pos = GetPosition(nextState === STATE_LONG ? PD_LONG : PD_SHORT);
        if (pos[1] >= AmountOP) {
            Log("Average Price", pos[0], "amount:", pos[1]);
            break;
        }
        // pfn(AmountOP-pos[1]);
        pfn(nextState === STATE_LONG ? _C(exchange.GetTicker).Sell * 1.001 : _C(exchange.GetTicker).Buy * 0.999, AmountOP-pos[1]);
        Sleep(Interval);
        CancelPendingOrders();
    }
}

function onTick(exchange) {
    var records = exchange.GetRecords();
    if (!records || records.length <= NPeriod) {
        return;
    }
    var Bar = records[records.length - 1];
    if (LastBarTime !== Bar.Time) {
        var HH = TA.Highest(records, NPeriod, 'High');
        var HC = TA.Highest(records, NPeriod, 'Close');
        var LL = TA.Lowest(records, NPeriod, 'Low');
        var LC = TA.Lowest(records, NPeriod, 'Close');

        var Range = Math.max(HH - LC, HC - LL);

        UpTrack = _N(Bar.Open + (Ks * Range));
        DownTrack = _N(Bar.Open - (Kx * Range));
        if (LastBarTime > 0) {
            var PreBar = records[records.length - 2];
            chart.add(0, [PreBar.Time, PreBar.Open, PreBar.High, PreBar.Low, PreBar.Close], -1);
        } else {
            for (var i = Math.min(records.length, NPeriod * 3); i > 1; i--) {
                var b = records[records.length - i];
                chart.add(0, [b.Time, b.Open, b.High, b.Low, b.Close]);
            }
        }
        chart.add(0, [Bar.Time, Bar.Open, Bar.High, Bar.Low, Bar.Close]);
        ChartCfg.yAxis.plotLines[0].value = UpTrack;
        ChartCfg.yAxis.plotLines[1].value = DownTrack;
        ChartCfg.subtitle = {
            text: 'Up Track: ' + UpTrack + '  Down Track: ' + DownTrack
        };
        chart.update(ChartCfg);
        chart.reset(PeriodShow);

        LastBarTime = Bar.Time;
    } else {
        chart.add(0, [Bar.Time, Bar.Open, Bar.High, Bar.Low, Bar.Close], -1);
    }

    LogStatus("Price:", Bar.Close, "Up:", UpTrack, "Down:", DownTrack, "Wins: ", Counter.w, "Losses:", Counter.l, "Date:", new Date());
    var msg;
    if (State === STATE_IDLE || State === STATE_SHORT) {
        if (Bar.Close >= UpTrack) {
            msg  = 'Long Price: ' + Bar.Close + ' Up Track:' + UpTrack;
            Log(msg);
            Trade(State, STATE_LONG);
            State = STATE_LONG;
            chart.add(1, {x:Bar.Time, color: 'red', shape: 'flag', title: 'Long', text: msg});
        }
    }

    if (State === STATE_IDLE || State === STATE_LONG) {
        if (Bar.Close <= DownTrack) {
            msg = 'Short Price: ' + Bar.Close + ' Down Track:' + DownTrack;
            Log(msg);
            Trade(State, STATE_SHORT);
            chart.add(1, {x:Bar.Time, color: 'green', shape: 'circlepin', title: 'Short', text: msg});
            State = STATE_SHORT;
        }
    }
}

function onexit() {
    var pos = exchange.GetPosition();
    if (pos.length > 0) {
        Log("Warning, has positions when exiting", pos);
    }
}

function main() {
    if (exchange.GetName() !== 'Futures_OKCoin') {
        throw "Only support OKEX features";
    }
    exchange.SetRate(1);
    exchange.SetContractType(["this_week", "next_week", "quarter"][ContractTypeIdx]);
    exchange.SetMarginLevel([10, 20][MarginLevelIdx]);

    if (exchange.GetPosition().length > 0) {
        throw "Can't have Positions when start.";}

    CancelPendingOrders();

    InitAccount = LastAccount = exchange.GetAccount();
    LoopInterval = Math.min(1, LoopInterval);
    Log('Exchange Name:', exchange.GetName(), InitAccount);
    LogStatus("Ready...");

    LogProfitReset();
    chart = Chart(ChartCfg);
    chart.reset();

    LoopInterval = Math.max(LoopInterval, 1);
    while (true) {
        onTick(exchange);
        Sleep(LoopInterval * 1000);
    }
}


Mehr

Das GrasHalten Sie diesen Beitrag auf dem Laufenden, fragen Sie gerne.