Handliche Transaktionen durch ein Terminal-Plugin

Schriftsteller:Das Gras, Erstellt: 2020-02-29 21:04:52, Aktualisiert: 2023-10-12 21:21:40

[TOC]img

Lebenslauf

FMZ ist eine Quantitative-Trading-Plattform, die hauptsächlich für die Dienstleistung von programmatisierten Händlern vorgesehen ist. Aber es bietet auch ein grundlegendes Trading-Terminal, das zwar einfach ist, aber manchmal auch nützlich ist. Zum Beispiel kann die Börse nicht geöffnet werden, während die API funktioniert.

img

Plugin-Prinzip

Das Plugin läuft in zwei Moden, sofort und im Hintergrund. Das ist gleichbedeutend mit der Erstellung eines Roboters (normaler Preis). Das Prinzip des Sofort-Runns ist dasselbe wie das Debugger: Es wird von einem Administrator ausgeführt, der ein Stück Code an die Transaktions-Terminalseite sendet, und unterstützt die Rückkehr von Diagrammen und Tabellen (das Debugger-Tool wird derzeit auch erweitert). Das gleiche kann nur in 5 Minuten ausgeführt werden, ohne Gebühr und ohne Sprachbegrenzung.

Bei der Erstellung von Strategien ist es notwendig, den Politiktyp als Plugin zu wählen.Das Ergebnis der main-Funktion des Plugins wird nach der Ausführung im Terminal angezeigt und unterstützt Strings, Diagramme und Tabellen. Da die Plugin-Ausführung keine Logs sieht, kann das Ergebnis der Ausführung des Plugins zurückgegeben werden.

Nutzung

  • 1.添加策略

Wenn Sie direkt in der Suche suchen, können Sie auch mehr Informationen finden, die Sie benötigen.Bitte beachten Sie, dass nur die Transaktions-Plugin-Typ-Richtlinie ausgeführt werden kann., dann klicken Sie auf Add.https://www.fmz.com/square/21/1

img img

  • 2.运行插件

Klicken Sie auf die Strategie, wenn Sie in die Parameter-Einstellungsoberfläche gelangen. Wenn keine Parameter vorhanden sind, wird direkt ausgeführt. Der von der Transaktionsterminal gewählte Trustee, das Transaktionspaar, die K-Zeilzyklen sind die entsprechenden Parameter.

img

  • 3.停止插件

Klicken Sie auf die Anzeigestelle, um das Plugin zu stoppen, da alle Plugins in einem Debugging-Tool-Prozess ausgeführt werden.

img

Beispiele für die Nutzung von Plugins

Plugins können eine Zeit lang Code ausführen, einige einfache Operationen ausführen, oft manuelle Operationen, die wiederholt ausgeführt werden müssen, können mit Plugins durchgeführt werden, um den Handel zu erleichtern.

Hilfsmittel für manuelle Futures-Horizont-Hedging

Futures cross-period hedging ist eine sehr häufige Strategie. Da die Frequenz nicht sehr hoch ist, werden viele Leute manuell operieren und benötigen einen Vertrag, um mehr zu machen, einen Vertrag, um zu leeren, um die Differenzbewegung zu analysieren.

Das erste, was wir hier machen, ist das Plugin für das Malen von Zeitunterschieden:

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
}

Die Plug-in-Source-Kopie-Adresse zeigt den aktuellen Wechselkurs und zeigt, wie man den Plugin-Quellcode kopiert:https://www.fmz.com/strategy/187755 img

Mit der Differenzanalyse wird festgestellt, dass sich die Differenzen konvergieren, es ist eine Gelegenheit, ein leeres Quartal zu machen, mehr als eine Woche zu machen. Dies ist eine Möglichkeit, die Sie mit einem Knopf-Hedge-Plugin verwenden können, und Sie können automatisch mehr als eine Woche leere Quartale erstellen, viel schneller als manuell.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())
}

Warten Sie, bis sich die Differenz annähert, benötigen Sie ein Gleichgewicht, können Sie ein Knopf-Plug-in für das Gleichgewicht mit der schnellsten Geschwindigkeit ausführen.


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)
            }
        }
    }
}

Hilfsgüterhandel

Das häufigste ist das Eisberg-Auftragen, das das große Blatt in kleine Blätter zerlegt, obwohl es als Roboter betrieben werden kann, ist ein 5-minütiges Plugin jedoch tatsächlich ausreichend. Es gibt zwei Arten von Eisberg-Auftragen, eine ist das Essen, eine ist das Aufhängen, wenn es einen Vorzug für die Bearbeitungsgebühren gibt, können Sie das Aufhängen wählen, das bedeutet, dass die Ausführung länger dauert.

Der folgende Code ist Iceberg, der den Plugin-Quellcode erworben hat:https://www.fmz.com/strategy/191771Und ich bin der Meinung, dass das nicht der Fall ist.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
        }
        
    }
}

Eine ständige Besetzung des Kauf- oder Verkaufsschlags ist auch eine Art der langsamen Lieferung, die einen relativ geringen Einfluss auf den Markt hat. Sie haben es gekauft:https://www.fmz.com/strategy/191582Verkauft: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)
    }
}

Manchmal kann man mehrere Aufträge in gewissen Abständen hängen, um einen besseren Versandpreis zu verkaufen, oder um eine Hangover-Lösung zu erwarten. Dieses Plugin kann auch für Futures-Hangovers verwendet werden.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'
}

Hilfsprodukte für Futures

Häufig verwendete Futures-Trading-Software hat oft viele fortgeschrittene Hanging-Orders-Funktionen, wie Hanging-Loss-Orders, Hanging-Conditions-Orders, etc., die sehr einfach in Plugins geschrieben werden können.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)
    }
}

Zusammenfassung

Wenn man so viele kleine Funktionen sieht, sollte man auch seine eigenen Ideen haben, wie man ein Plugin schreibt, um seine eigenen manuellen Transaktionen zu ermöglichen.


Verwandt

Mehr

SchwimmenWas ist der Grund für die Fehlermeldung? Error: Futures_OP 0: 400: {"error_message":"Open orders exist","code":35017,"error_code":"35017","message":"Open orders exist"} Buy ((5000, 0.1): 400: {"error_message":"order_size error","result":"true","error_code":"35063","order_id":"-1"}

Das GrasÜberprüfen Sie die Dokumentation der Börse oder konsultieren Sie den Kundendienst der Börse