3
konzentrieren Sie sich auf
1444
Anhänger

Verwenden Sie Handelsterminal-Plugins, um den manuellen Handel zu erleichtern

Erstellt in: 2020-02-29 21:04:52, aktualisiert am: 2023-10-12 21:21:40
comments   2
hits   4054

[TOC] Verwenden Sie Handelsterminal-Plugins, um den manuellen Handel zu erleichtern

Einführung

Als quantitative Handelsplattform ist FMZ in erster Linie für programmatische Händler konzipiert. Es bietet aber auch ein einfaches Handelsterminal. Obwohl die Funktion einfach ist, kann sie manchmal sehr nützlich sein. Wenn beispielsweise die Börse beschäftigt ist und nicht geöffnet werden kann, die API aber weiterhin funktioniert, können Sie das Terminal verwenden, um Aufträge zu stornieren. , Bestellungen aufgeben, Angebotskonten anzeigen usw. Um das Erlebnis mit dem Handelsterminal zu verbessern, wurde eine Plug-In-Funktionalität hinzugefügt. Manchmal benötigen wir eine kleine Funktion, die uns beim Handel unterstützt, wie z. B. Ladder Pending Orders, Iceberg Orders, One-Click Hedging, One-Click Closing usw. Wir müssen uns das Ausführungsprotokoll nicht wirklich ansehen. Es ist etwas umständlich um einen neuen Roboter zu erstellen. Klicken Sie einfach auf das Plug-In im Terminal. Sie können sofort die entsprechenden Funktionen realisieren, was den manuellen Handel erheblich erleichtern kann. Der Plugin-Speicherort ist wie folgt:

Verwenden Sie Handelsterminal-Plugins, um den manuellen Handel zu erleichtern

Plugin-Prinzip

Für den Plug-In-Betrieb gibt es zwei Modi: Sofortbetrieb und Hintergrundbetrieb. Das Ausführen im Hintergrund entspricht der Erstellung eines Roboters (es fallen die normalen Gebühren an). Das Prinzip der sofortigen Bedienung ist das gleiche wie das des Debugging-Tools: Senden Sie einen Codeabschnitt zur Ausführung an den Verwalter der Handelsterminalseite und unterstützen Sie die Rückgabe von Diagrammen und Tabellen (das Debugging-Tool wird derzeit ebenfalls aktualisiert, um dies zu unterstützen ). Ebenso ist es nur 5 Minuten lang ausführbar, kostenfrei und sprachlich unbegrenzt. Plugins mit sehr kurzen Ausführungszeiten können den Sofortausführungsmodus verwenden, während komplexe Strategien, deren Ausführung lange dauert, weiterhin laufende Roboter erfordern.

Beim Schreiben einer Richtlinie müssen Sie den Richtlinientyp als Plug-In auswählen. Das Ergebnis der Rückgabe der Hauptfunktion des Plugins wird nach dem Ausführen im Terminal angezeigt und unterstützt Zeichenfolgen, Zeichnungen und Tabellen. Da die Protokolle während der Ausführung des Plugins nicht angezeigt werden können, kann das Ausführungsergebnis des Plugins zurückgegeben werden.

Anwendung

  • 1. Fügen Sie eine Strategie hinzu

Suchen Sie wie angezeigt direkt im Suchfeld.Beachten Sie, dass nur Strategien vom Typ „Trading Plugin“ ausgeführt werden könnenund klicken Sie dann auf Hinzufügen. Öffentliche Plugins finden Sie auf Strategy Square: https://www.fmz.com/square/21/1

Verwenden Sie Handelsterminal-Plugins, um den manuellen Handel zu erleichtern Verwenden Sie Handelsterminal-Plugins, um den manuellen Handel zu erleichtern

  • 2. Führen Sie das Plugin aus

Klicken Sie auf die Strategie, um die Parametereinstellungsoberfläche aufzurufen. Wenn keine Parameter vorhanden sind, wird sie direkt ausgeführt. Der vom Handelsterminal ausgewählte Depotverwalter, das Handelspaar und der K-Line-Zeitraum sind die entsprechenden Standardparameter. Klicken Sie auf die Ausführungsrichtlinie, um die Ausführung zu starten, und wählen Sie den Modus „Jetzt ausführen“ (Sie können sich den Standardausführungsmodus merken). Das Plugin zeigt keine Protokolle an.

Verwenden Sie Handelsterminal-Plugins, um den manuellen Handel zu erleichtern

  • 3. Stoppen Sie das Plugin

Klicken Sie auf das Symbol, um das Plug-In zu stoppen. Da alle Plug-Ins in einem Debugging-Tool-Prozess ausgeführt werden, werden alle Plug-Ins gestoppt.

Verwenden Sie Handelsterminal-Plugins, um den manuellen Handel zu erleichtern

Beispiele für die Verwendung von Plugins

Plugins können Code für einen bestimmten Zeitraum ausführen und einige einfache Vorgänge durchführen. Häufig können Vorgänge, die manuell wiederholt werden müssen, mithilfe von Plugins implementiert werden, wodurch Transaktionen bequemer werden. Im Folgenden wird es anhand spezifischer Beispiele vorgestellt. Der bereitgestellte Quellcode kann als Referenz zum Anpassen Ihrer eigenen Strategie verwendet werden.

Unterstütztes manuelles Futures-Hedging über mehrere Perioden hinweg

Die periodenübergreifende Absicherung von Futures ist eine sehr verbreitete Strategie. Da die Frequenz nicht sehr hoch ist, werden viele Leute sie manuell betreiben, wobei sie einen Kontrakt zum Long- und einen zum Short-Handeln benötigen und den Preisunterschiedstrend analysieren können. Durch die Verwendung von Plugins in Ihrem Handelsterminal sparen Sie Energie.

Als erstes möchte ich das Plug-In für zeitraumübergreifende Preisdifferenzen vorstellen:

var chart = { 
   __isStock: true,    
   title : { text : '差价分析图'},                     
   xAxis: { type: 'datetime'},                 
   yAxis : {                                        
       title: {text: '差价'},                   
       opposite: false,                             
   },
   series : [                    
       {name : "diff", data : []}, 

   ]
}
function main() {
   exchange.SetContractType('quarter')
   var recordsA = exchange.GetRecords(PERIOD_M5) //周期可以自行定制
   exchange.SetContractType('this_week')
   var recordsB = exchange.GetRecords(PERIOD_M5)
   
   for(var i=0;i<Math.min(recordsA.length,recordsB.length);i++){
       var diff = recordsA[recordsA.length-Math.min(recordsA.length,recordsB.length)+i].Close - recordsB[recordsB.length-Math.min(recordsA.length,recordsB.length)+i].Close
       chart.series[0].data.push([recordsA[recordsA.length-Math.min(recordsA.length,recordsB.length)+i].Time, diff])
   }
   return chart
}

Mit einem Klick können Sie die aktuellen Inter-Perioden-Spreads auf einen Blick sehen. Die Adresse des Quellcodes des Plugins: https://www.fmz.com/strategy/187755 Verwenden Sie Handelsterminal-Plugins, um den manuellen Handel zu erleichtern

Mit der Spread-Analyse stellen Sie fest, dass der Spread konvergiert, was eine Gelegenheit darstellt, den Quartalskontrakt zu shorten und die aktuelle Woche zu longen. Zu diesem Zeitpunkt können Sie das Ein-Klick-Hedging-Plugin verwenden. Mit einem Klick wird es hilft Ihnen automatisch dabei, den Quartalskontrakt zu shorten und die aktuelle Woche zu longen, was schneller ist als die manuelle Bedienung. Ziemlich viele. Das Umsetzungsprinzip der Strategie besteht darin, die gleiche Anzahl von Positionen mit Slippage zu eröffnen. Sie können sie mehrmals ausführen, um langsam die gewünschte Position zu erreichen und Auswirkungen auf den Markt zu vermeiden. Sie können die Standardparameter ändern, um Aufträge schneller zu platzieren. Adresse der Strategiekopie: https://www.fmz.com/strategy/191348

function main(){
    exchange.SetContractType(Reverse ? Contract_B : Contract_A)
    var ticker_A = exchange.GetTicker()
    if(!ticker_A){return 'Unable to get quotes'}
    exchange.SetDirection('buy')
    var id_A = exchange.Buy(ticker_A.Sell+Slip, Amount)
    exchange.SetContractType(Reverse ? Contract_B : Contract_A)
    var ticker_B = exchange.GetTicker()
    if(!ticker_B){return 'Unable to get quotes'}
    exchange.SetDirection('sell')
    var id_B = exchange.Sell(ticker_B.Buy-Slip, Amount)
    if(id_A){
        exchange.SetContractType(Reverse ? Contract_B : Contract_A)
        exchange.CancelOrder(id_A)
    }
    if(id_B){
        exchange.SetContractType(Reverse ? Contract_B : Contract_A)
        exchange.CancelOrder(id_B)
    }
    return 'Position: ' + JSON.stringify(exchange.GetPosition())
}

Wenn Sie, während Sie auf die Konvergenz der Preisdifferenz warten, die Position schließen müssen, können Sie das Ein-Klick-Schließ-Plugin ausführen, um die Position so schnell wie möglich zu schließen.


function main(){
    while(ture){
        var pos = exchange.GetPosition()
        var ticker = exchange.GetTicekr()
        if(!ticker){return '无法获取ticker'}
        if(!pos || pos.length == 0 ){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)
            }
        }
    }
}

Unterstützter Spothandel

Am gebräuchlichsten ist die Iceberg-Order, bei der große Orders in kleine Orders aufgeteilt werden. Obwohl sie als Roboter ausgeführt werden kann, reicht eigentlich ein 5-Minuten-Plug-in aus. Es gibt zwei Arten von Iceberg-Orders: eine ist die Annahme der Bestellung und die andere ist die Platzierung der Bestellung. Wenn es einen Rabatt auf die Bearbeitungsgebühr gibt, können Sie die Bestellung platzieren, was bedeutet, dass die Ausführungszeit länger ist.

Der folgende Code ist der Quellcode des Iceberg Order Buying Plug-in: https://www.fmz.com/strategy/191771. Quellcode verkaufen: https://www.fmz.com/strategy/191772

function main(){
    var initAccount = _C(exchange.GetAccount)
    while(true){
        var account = _C(exchange.GetAccount)
        var dealAmount = account.Stocks - initAccount.Stocks
        var ticker = _C(exchange.GetTicker)
        if(BUYAMOUNT - dealAmount >= BUYSIZE){
            var id = exchange.Buy(ticker.Sell, BUYSIZE)
            Sleep(INTERVAL*1000)
            if(id){
                exchange.CancelOrder(id) // May cause error log when the order is completed, which is all right.
            }else{
                throw 'buy error'
            }
        }else{
            account = _C(exchange.GetAccount)
            var avgCost = (initAccount.Balance - account.Balance)/(account.Stocks - initAccount.Stocks)
            return 'Iceberg order to buy is done, avg cost is '+avgCost
        }
        
    }
}

Das ständige Einhalten des „Eins kaufen“- oder „Eins verkaufen“-Preises ist auch eine Möglichkeit, Waren langsam auszuliefern, was relativ geringe Auswirkungen auf den Markt hat. Bei dieser Strategie gibt es noch einige Bereiche, die verbessert werden können. Sie können das Mindesttransaktionsvolumen oder die Genauigkeit manuell ändern. Kaufen: https://www.fmz.com/strategy/191582 Verkaufen: https://www.fmz.com/strategy/191730

function GetPrecision(){
    var precision = {price:0, amount:0}
    var depth = exchange.GetDepth()
    for(var i=0;i<exchange.GetDepth().Asks.length;i++){
        var amountPrecision = exchange.GetDepth().Asks[i].Amount.toString().indexOf('.') > -1 ? exchange.GetDepth().Asks[i].Amount.toString().split('.')[1].length : 0
        precision.amount = Math.max(precision.amount,amountPrecision)
        var pricePrecision = exchange.GetDepth().Asks[i].Price.toString().indexOf('.') > -1 ? exchange.GetDepth().Asks[i].Price.toString().split('.')[1].length : 0
        precision.price = Math.max(precision.price,pricePrecision)
    }
    return precision
}

function main(){
    var initAccount = exchange.GetAccount()
    if(!initAccount){return '无法获取账户信息'}
    var precision = GetPrecision()
    var buyPrice = 0
    var lastId = 0
    var done = false
    while(true){
        var account = _C(exchange.GetAccount)
        var dealAmount = account.Stocks - initAccount.Stocks
        var ticker = _C(exchange.GetTicker)
        if(BuyAmount - dealAmount > 1/Math.pow(10,precision.amount) && ticker.Buy > buyPrice){
            if(lastId){exchange.CancelOrder(lastId)}
            var id = exchange.Buy(ticker.Buy, _N(BuyAmount - dealAmount,precision.amount))
            if(id){
                lastId = id
            }else{
                done = true
            }
        }
        if(BuyAmount - dealAmount <= 1/Math.pow(10,precision.amount)){done = true}
        if(done){
            var avgCost = (initAccount.Balance - account.Balance)/dealAmount
            return 'order is done, avg cost is ' + avgCost  // including fee cost
        }
        Sleep(Intervel*1000)
    }
}

Um zu einem besseren Preis zu verkaufen oder auf ein Schnäppchen zu warten, können Sie manchmal mehrere Bestellungen in einem bestimmten Abstand aufgeben. Dieses Plugin kann auch für ausstehende Futures-Orders verwendet werden. Adresse der Quellcode-Kopie: https://www.fmz.com/strategy/190017


function main() {
    var ticker = exchange.GetTicker()
    if(!ticker){
        return  'Unable to get price'
    }
    for(var i=0;i<N;i++){
        if(Type == 0){
            if(exchange.GetName().startsWith('Futures')){
                exchange.SetDirection('buy')
            }
            exchange.Buy(Start_Price-i*Spread,Amount+i*Amount_Step)
        }else if(Type == 1){
            if(exchange.GetName().startsWith('Futures')){
                exchange.SetDirection('sell')
            }
            exchange.Sell(Start_Price+i*Spread,Amount+i*Amount_Step)
        }else if(Type == 2){
            exchange.SetDirection('closesell')
            exchange.Buy(Start_Price-i*Spread,Amount+i*Amount_Step)
        }
        else if(Type == 3){
            exchange.SetDirection('closebuy')
            exchange.Sell(Start_Price+i*Spread,Amount+i*Amount_Step)
        }
        Sleep(500)
    }
    return 'order complete'
}

Unterstützter Rohstoff-Futures-Handel

Häufig verwendete Futures-Handelssoftware verfügt oft über viele erweiterte Funktionen zur Auftragserteilung, wie z. B. die Platzierung von Stop-Loss-Aufträgen, die Platzierung bedingter Aufträge usw., die problemlos in Plug-Ins geschrieben werden können. Hier ist ein Plug-In, mit dem Sie eine ausstehende Order sofort nach ihrer Ausführung schließen können. Adresse kopieren: https://www.fmz.com/strategy/187736

var buy = false
var trade_amount = 0
function main(){
    while(true){
        if(exchange.IO("status")){
            exchange.SetContractType(Contract)
            if(!buy){
                buy = true
                if(Direction == 0){
                    exchange.SetDirection('buy')
                    exchange.Buy(Open_Price, Amount)
                }else{
                    exchange.SetDirection('sell')
                    exchange.Sell(Open_Price, Amount)
                }
            }
            var pos = exchange.GetPosition()
            if(pos && pos.length > 0){
                for(var i=0;i<pos.length;i++){
                    if(pos[i].ContractType == Contract && pos[i].Type == Direction && pos[i].Amount-pos[i].FrozenAmount>0){
                        var cover_amount = math.min(Amount-trade_amount, pos[i].Amount-pos[i].FrozenAmount)
                        if(cover_amount >= 1){
                            trade_amount += cover_amount
                            if(Direction == 0){
                                exchange.SetDirection('closebuy_today')
                                exchange.Sell(Close_Price, cover_amount)
                            }else{
                                exchange.SetDirection('closesell_today')
                                exchange.Buy(Close_Price, cover_amount)
                            }
                        }
                    }
                }
            }
        } else {
            LogStatus(_D(), "未连接CTP !")
            Sleep(10000)
        }
        if(trade_amount >= Amount){
            Log('任务完成')
            return
        }
        Sleep(1000)
    }
}

Zusammenfassen

Nachdem Sie so viele kleine Funktionen gesehen haben, sollten Sie Ihre eigenen Ideen haben. Sie können diese auch in Plug-Ins schreiben, um Ihren manuellen Handel zu erleichtern.