Sumber dimuat naik... memuat...

Gunakan terminal dagangan pemalam untuk memudahkan perdagangan manual

Penulis:Kebaikan, Dicipta: 2020-07-30 11:39:54, Dikemas kini: 2023-10-25 19:56:42

img

Pengantar

FMZ.COM, sebagai platform perdagangan kuantitatif, adalah terutamanya untuk melayani peniaga berprogram. Tetapi ia juga menyediakan terminal perdagangan asas. Walaupun fungsinya mudah, kadang-kadang ia boleh berguna. Sebagai contoh, jika bursa sibuk dan tidak dapat dikendalikan, tetapi API masih berfungsi. Pada masa ini, anda boleh menarik balik pesanan, meletakkan pesanan, dan melihatnya melalui terminal. Untuk meningkatkan pengalaman terminal perdagangan, pemalam kini ditambah. Kadang-kadang, kita memerlukan fungsi kecil untuk membantu urus niaga, seperti perintah menunggu tangga, pesanan aisberg, lindung nilai satu klik, kedudukan penutupan satu klik dan operasi lain. Tidak perlu melihat log pelaksanaan robot. Ia agak rumit untuk membuat log baru. Hanya klik pemalam di terminal, Fungsi pemalam yang sesuai dapat diwujudkan dengan serta-merta, yang dapat memudahkan transaksi manual. Lokasi pemalam adalah seperti berikut:

img

Prinsip plug-in

Terdapat dua mod operasi pemalam, operasi segera dan operasi latar belakang. Berjalan di latar belakang adalah bersamaan dengan membuat robot (tugas biasa). Prinsip operasi segera adalah sama dengan alat pecahannya: menghantar sekeping kod ke docker halaman terminal perdagangan untuk pelaksanaan, dan sokongan untuk mengembalikan carta dan jadual (alat pecahannya kini juga dinaik taraf untuk menyokong), yang sama hanya boleh dijalankan selama 5 minit, tidak ada yuran, tidak ada sekatan Bahasa. Pemalam dengan masa pelaksanaan yang singkat boleh menggunakan mod pelaksanaan segera, sementara strategi yang rumit dan lama masih perlu menjalankan robot.

Apabila menulis strategi, anda perlu memilih jenis strategi sebagai pemalam.mainfungsireturnkerana pelaksanaan pemalam tidak dapat melihat log, anda bolehreturnhasil pelaksanaan pemalam.

Cara menggunakan

  • Tambah strategi

Cari terus dalam kotak carian seperti yang ditunjukkan dalam gambar. Perhatikan bahawa hanya strategi jenis plugin perdagangan yang boleh dijalankan, dan kemudian klik Tambah. Plugin awam boleh didapati di Strategy Square:https://www.fmz.com/square/21/1

img img

  • Jalankan pemalam

Klik pada strategi untuk memasuki antara muka tetapan parameter. Jika tidak ada parameter, ia akan berjalan terus. Docker, pasangan dagangan, dan tempoh K-line yang dipilih oleh terminal dagangan adalah parameter yang sepadan secara lalai. Klik strategi pelaksanaan untuk memulakan pelaksanaan, dan pilih mod Execute Now (anda boleh ingat mod operasi lalai). Plugin tidak akan memaparkan log.

img

  • Hentikan plugin

Klik kedudukan ikon untuk menghentikan pemalam. Oleh kerana semua pemalam dijalankan dalam proses alat debugging, semua pemalam akan dihentikan.

img

Contoh penggunaan pemalam

Plug-in boleh menjalankan kod untuk tempoh masa dan melakukan beberapa operasi mudah. Dalam banyak kes, operasi manual yang memerlukan operasi berulang boleh dilaksanakan dengan plugin untuk memudahkan transaksi. Berikut akan memperkenalkan contoh khusus, dan kod sumber yang diberikan boleh digunakan sebagai rujukan untuk menyesuaikan strategi anda sendiri.

Membantu perdagangan lindung nilai intertemporal berjangka manual

Perdagangan lindung nilai intertemporal niaga hadapan adalah strategi yang sangat biasa. Kerana kekerapan tidak sangat tinggi, ramai orang akan mengendalikannya secara manual. Adalah perlu untuk membuat satu kontrak panjang dan satu kontrak pendek, jadi lebih baik untuk menganalisis trend penyebaran. Menggunakan pemalam di terminal perdagangan akan menjimatkan tenaga anda.

Pengenalan pertama adalah untuk melukis pemalam perbezaan harga antara tempoh:

var chart = { 
   __isStock: true,    
   title : { text : 'Spread analysis chart'},                     
   xAxis: { type: 'datetime'},                 
   yAxis : {                                        
       title: {text: 'Spread'},                   
       opposite: false,                             
   },
   series : [                    
       {name : "diff", data : []}, 

   ]
}
function main() {
   exchange.SetContractType('quarter')
   var recordsA = exchange.GetRecords(PERIOD_M5) //Cycle can be customized
   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
}

Klik sekali, perbezaan harga antara tempoh baru-baru ini jelas pada sekilas, alamat salinan kod sumber pemalam:https://www.fmz.com/strategy/187755

img

Dengan analisis penyebaran, didapati bahawa penyebaran sedang konvergen. Ini adalah peluang untuk pendek kontrak suku tahunan dan pergi panjang untuk minggu semasa. Ini adalah peluang untuk menggunakan pemalam lindung nilai satu klik, satu klik akan membantu anda secara automatik pendek suku tahunan dan panjang mingguan, yang lebih cepat daripada operasi manual. Prinsip pelaksanaan strategi adalah untuk membuka jumlah kedudukan yang sama dengan harga bergerak. Anda boleh menjalankan beberapa kali lagi untuk perlahan-lahan mencapai kedudukan yang anda inginkan untuk mengelakkan memberi kesan kepada pasaran. Anda boleh mengubah parameter lalai untuk meletakkan pesanan lebih cepat. Alamat salinan strategi: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())
}

Menunggu perbezaan harga untuk berkumpul dan anda perlu menutup kedudukan, anda boleh menjalankan satu klik penutupan pemalam untuk menutup kedudukan secepat mungkin.

function main(){
    while(ture){
        var pos = exchange.GetPosition()
        var ticker = exchange.GetTicekr()
        if(!ticker){return 'Unable to get ticker'}
        if(!pos || pos.length == 0 ){return 'No holding position'}
        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)
            }
        }
    }
}

Plug-in untuk membantu perdagangan spot

Yang paling biasa adalah komisen aisberg, yang membahagikan pesanan besar menjadi pesanan kecil. Walaupun ia boleh dijalankan sebagai robot, plug-in 5 minit sebenarnya mencukupi. Terdapat dua jenis pesanan aisberg, satu mengambil pesanan dan yang lain menunggu pesanan. Jika ada yuran istimewa, anda boleh memilih pesanan menunggu, yang bermaksud masa pelaksanaan lebih lama.

Kod berikut adalah kod sumber plug-in yang ditugaskan oleh aisberg:https://www.fmz.com/strategy/191771Untuk dijual: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
        }
        
    }
}

Ia juga merupakan cara untuk perlahan-lahan menghantar produk untuk menduduki Beli 1 atau Jual 1 lapisan harga sepanjang masa, dan kesannya pada pasaran agak kecil.

Beli:https://www.fmz.com/strategy/191582

Jual: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 'Unable to get account information'}
    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)
    }
}

Kadang-kadang, untuk menjual harga penghantaran yang lebih baik atau menunggu pesanan hilang yang sedang menunggu, beberapa pesanan boleh diletakkan pada selang waktu tertentu.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'
}

Plug-in untuk membantu perdagangan niaga hadapan komoditi

Perisian dagangan niaga hadapan yang biasa digunakan sering mempunyai banyak fungsi pesanan menunggu yang maju, seperti pesanan stop-loss yang menunggu, pesanan keadaan yang menunggu, dan lain-lain, yang boleh dengan mudah ditulis sebagai pemalam.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 is not connected!")
            Sleep(10000)
        }
        if(trade_amount >= Amount){
            Log('mission completed')
            return
        }
        Sleep(1000)
    }
}

Ringkasnya

Selepas membaca begitu banyak fungsi kecil, anda juga harus mempunyai idea anda sendiri.


Berkaitan

Lebih lanjut