3
fokus pada
1444
Pengikut

Gunakan pemalam terminal dagangan untuk memudahkan perdagangan manual

Dicipta dalam: 2020-02-29 21:04:52, dikemas kini pada: 2023-10-12 21:21:40
comments   2
hits   4054

[TOC] Gunakan pemalam terminal dagangan untuk memudahkan perdagangan manual

pengenalan

Sebagai platform dagangan kuantitatif, FMZ direka terutamanya untuk memberi perkhidmatan kepada pedagang program. Tetapi ia juga menyediakan terminal dagangan asas Walaupun fungsinya mudah, ia kadang-kadang boleh menjadi sangat berguna Sebagai contoh, jika pertukaran sibuk dan tidak boleh dibuka, tetapi API masih boleh berfungsi, anda boleh menggunakan terminal untuk membatalkan pesanan. , buat pesanan dan lihat akaun Sebut Harga, dsb. Untuk menambah baik pengalaman terminal dagangan, fungsi pemalam telah ditambah. Kadang-kadang, kita memerlukan fungsi kecil untuk membantu dalam perdagangan, seperti pesanan tertunda tangga, pesanan iceberg, lindung nilai satu klik, penutupan satu klik, dan lain-lain. Kita tidak perlu melihat log pelaksanaan Ia agak menyusahkan untuk mencipta robot baharu Hanya klik pemalam di terminal , anda boleh segera merealisasikan fungsi yang sepadan, yang boleh memudahkan perdagangan manual. Lokasi pemalam adalah seperti berikut:

Gunakan pemalam terminal dagangan untuk memudahkan perdagangan manual

Prinsip Plugin

Terdapat dua mod untuk operasi pemalam: operasi segera dan operasi latar belakang. Berjalan di latar belakang adalah bersamaan dengan mencipta robot (caj biasa dikenakan). Prinsip operasi segera adalah sama seperti alat penyahpepijatan: hantar sekeping kod kepada penjaga halaman terminal dagangan untuk pelaksanaan, dan menyokong pengembalian carta dan jadual (alat penyahpepijatan juga sedang dinaik taraf untuk menyokong ini ). Begitu juga, ia hanya boleh dilaksanakan selama 5 minit, percuma dan bahasa tanpa had. Pemalam dengan masa pelaksanaan yang sangat singkat boleh menggunakan mod larian segera, manakala strategi kompleks yang memerlukan masa yang lama untuk dijalankan masih memerlukan robot berjalan.

Semasa menulis dasar, anda perlu memilih jenis dasar sebagai pemalam. Hasil pengembalian fungsi utama pemalam akan muncul dalam terminal selepas larian, rentetan sokongan, lukisan dan jadual. Oleh kerana log tidak dapat dilihat semasa pelaksanaan pemalam, hasil pelaksanaan pemalam boleh dikembalikan.

Cara menggunakan

  • 1. Tambah strategi

Cari terus dalam kotak carian seperti yang ditunjukkan.Ambil perhatian bahawa hanya strategi jenis pemalam dagangan boleh dijalankan, dan kemudian klik Tambah. Pemalam awam boleh didapati di Strategy Square: https://www.fmz.com/square/21/1

Gunakan pemalam terminal dagangan untuk memudahkan perdagangan manual Gunakan pemalam terminal dagangan untuk memudahkan perdagangan manual

  • 2. Jalankan pemalam

Klik pada strategi untuk memasuki antara muka tetapan parameter Jika tiada parameter, ia akan dijalankan secara langsung Tempoh kustodian, pasangan dagangan dan K-line yang dipilih oleh terminal dagangan adalah parameter lalai yang sepadan. Klik pada dasar pelaksanaan untuk memulakan pelaksanaan, dan pilih mod “Lakukan Sekarang” (anda boleh mengingati mod larian lalai). Pemalam tidak akan memaparkan log.

Gunakan pemalam terminal dagangan untuk memudahkan perdagangan manual

  • 3. Hentikan pemalam

Klik ikon untuk menghentikan pemalam Memandangkan semua pemalam dilaksanakan dalam satu proses alat penyahpepijatan, semua pemalam akan dihentikan.

Gunakan pemalam terminal dagangan untuk memudahkan perdagangan manual

Contoh penggunaan pemalam

Pemalam boleh melaksanakan kod untuk tempoh masa dan boleh melakukan beberapa operasi mudah Banyak kali, operasi yang perlu diulang secara manual boleh dilaksanakan menggunakan pemalam, menjadikan transaksi lebih mudah. Berikut akan memperkenalkannya dengan contoh khusus, dan kod sumber yang disediakan boleh digunakan sebagai rujukan untuk menyesuaikan strategi anda sendiri.

Lindung nilai rentas tempoh niaga hadapan manual dibantu

Lindung nilai niaga hadapan merentas tempoh ialah strategi yang sangat biasa Memandangkan kekerapannya tidak terlalu tinggi, ramai orang akan mengendalikannya secara manual, memerlukan satu kontrak untuk pergi panjang dan satu kontrak untuk pergi pendek, dan mereka boleh menganalisis arah aliran perbezaan harga. Menggunakan pemalam dalam terminal dagangan anda akan menjimatkan tenaga anda.

Perkara pertama yang saya ingin perkenalkan ialah pemalam perbezaan harga merentas tempoh:

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
}

Dengan satu klik, anda boleh melihat penyebaran antara tempoh terkini sepintas lalu Alamat salinan kod sumber pemalam: https://www.fmz.com/strategy/187755 Gunakan pemalam terminal dagangan untuk memudahkan perdagangan manual

Dengan analisis spread, anda mendapati bahawa spread sedang menumpu, yang merupakan peluang untuk memendekkan kontrak suku tahunan dan memanjangkan minggu semasa Pada masa ini, anda boleh menggunakan pemalam lindung nilai satu klik Dengan satu klik, ia akan secara automatik membantu anda memendekkan kontrak suku tahunan dan memanjangkan minggu semasa, yang lebih cepat daripada operasi manual. Prinsip pelaksanaan strategi adalah untuk membuka bilangan kedudukan yang sama dengan gelinciran Anda boleh menjalankannya beberapa kali untuk mencapai kedudukan yang diperlukan secara perlahan dan mengelakkan kesan pasaran Anda boleh menukar parameter lalai untuk membuat pesanan dengan 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())
}

Sementara menunggu perbezaan harga menumpu, jika anda perlu menutup kedudukan, anda boleh menjalankan pemalam penutup satu klik untuk menutup kedudukan pada kelajuan terpantas.


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

Perdagangan spot dibantu

Yang paling biasa ialah pesanan aisberg, yang membahagikan pesanan besar kepada pesanan kecil Walaupun ia boleh dijalankan sebagai robot, pemalam selama 5 minit sebenarnya sudah mencukupi. Terdapat dua jenis pesanan iceberg, satu untuk mengambil pesanan dan satu lagi untuk membuat pesanan Jika ada diskaun yuran pengendalian, anda boleh memilih untuk membuat pesanan, bermakna masa pelaksanaan akan lebih lama.

Kod berikut ialah kod sumber Iceberg Order Buying Plug-in: https://www.fmz.com/strategy/191771. Jual kod sumber: 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
        }
        
    }
}

Sentiasa menduduki harga beli satu atau jual satu juga merupakan cara untuk menghantar barang secara perlahan, yang mempunyai kesan yang agak kecil pada pasaran. Masih terdapat beberapa bahagian untuk penambahbaikan dalam strategi ini Anda boleh menukar volum atau ketepatan transaksi minimum secara manual. 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 '无法获取账户信息'}
    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)
    }
}

Kadangkala, untuk menjual pada harga yang lebih baik atau menunggu tawaran murah, anda boleh membuat beberapa pesanan pada selang waktu tertentu. Pemalam ini juga boleh digunakan untuk pesanan belum selesai niaga hadapan. Alamat salinan kod sumber: 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'
}

Dagangan hadapan komoditi dibantu

Perisian dagangan niaga hadapan yang biasa digunakan selalunya mempunyai banyak fungsi penempatan pesanan lanjutan, seperti meletakkan pesanan henti rugi, membuat pesanan bersyarat, dsb., yang boleh ditulis dengan mudah ke dalam pemalam. Berikut ialah pemalam yang membolehkan anda menutup pesanan yang belum selesai serta-merta selepas ia dilaksanakan. Salin alamat: 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)
    }
}

ringkaskan

Selepas melihat begitu banyak fungsi kecil, anda sepatutnya mempunyai idea anda sendiri. Anda juga boleh menulisnya ke dalam pemalam untuk memudahkan perdagangan manual anda.