3
focar em
1444
Seguidores

Use plug-ins de terminal de negociação para facilitar a negociação manual

Criado em: 2020-02-29 21:04:52, atualizado em: 2023-10-12 21:21:40
comments   2
hits   4054

[TOC] Use plug-ins de terminal de negociação para facilitar a negociação manual

Introdução

Como uma plataforma de negociação quantitativa, a FMZ foi projetada principalmente para atender traders programáticos. Mas também fornece um terminal de negociação básico. Embora a função seja simples, pode ser muito útil às vezes. Por exemplo, se a bolsa estiver ocupada e não puder ser aberta, mas a API ainda puder funcionar, você pode usar o terminal para cancelar ordens , fazer pedidos e visualizar contas de cotação, etc. Para melhorar a experiência do terminal de negociação, a funcionalidade de plug-in foi adicionada. Às vezes, precisamos de uma pequena função para auxiliar na negociação, como ordens pendentes de escada, ordens de iceberg, hedging de um clique, fechamento de um clique, etc. Não precisamos realmente olhar para o log de execução. É um pouco trabalhoso para criar um novo robô. Basta clicar no plug-in no terminal. , você pode perceber imediatamente as funções correspondentes, o que pode facilitar muito a negociação manual. A localização do plugin é a seguinte:

Use plug-ins de terminal de negociação para facilitar a negociação manual

Princípio do plugin

Há dois modos de operação do plug-in: operação imediata e operação em segundo plano. Executar em segundo plano é equivalente a criar um robô (custos normais são aplicáveis). O princípio de operação imediata é o mesmo da ferramenta de depuração: enviar um pedaço de código ao custodiante da página do terminal de negociação para execução e dar suporte ao retorno de gráficos e tabelas (a ferramenta de depuração também está atualizada para oferecer suporte a isso ). Da mesma forma, ele só pode ser executado por 5 minutos, gratuitamente e em idioma ilimitado. Plugins com tempos de execução muito curtos podem usar o modo de execução imediata, enquanto estratégias complexas que exigem muito tempo para serem executadas ainda exigem robôs em execução.

Ao escrever uma política, você precisa selecionar o tipo de política como plug-in. O resultado do retorno da função principal do plugin aparecerá no terminal após a execução, suportando strings, desenhos e tabelas. Como os logs não podem ser vistos durante a execução do plugin, o resultado da execução do plugin pode ser retornado.

Como usar

  • 1. Adicione uma estratégia

Pesquise diretamente na caixa de pesquisa, conforme mostrado.Observe que apenas estratégias do tipo plugin de negociação podem ser executadase clique em Adicionar. Plugins públicos podem ser encontrados no Strategy Square: https://www.fmz.com/square/21/1

Use plug-ins de terminal de negociação para facilitar a negociação manual Use plug-ins de terminal de negociação para facilitar a negociação manual

  • 2. Execute o plugin

Clique na estratégia para entrar na interface de configuração de parâmetros. Se não houver parâmetros, ela será executada diretamente. O custodiante, o par de negociação e o período da linha K selecionados pelo terminal de negociação são os parâmetros correspondentes padrão. Clique na política de execução para iniciar a execução e selecione o modo “Executar agora” (você deve se lembrar do modo de execução padrão). O plugin não exibirá logs.

Use plug-ins de terminal de negociação para facilitar a negociação manual

  • 3. Pare o plugin

Clique no ícone para parar o plug-in. Como todos os plug-ins são executados em um processo de ferramenta de depuração, todos os plug-ins serão parados.

Use plug-ins de terminal de negociação para facilitar a negociação manual

Exemplos de uso de plugins

Plugins podem executar código por um período de tempo e podem realizar algumas operações simples. Muitas vezes, operações que precisam ser repetidas manualmente podem ser implementadas usando plugins, tornando as transações mais convenientes. A seguir, apresentaremos o método com exemplos específicos, e o código-fonte fornecido pode ser usado como referência para personalizar sua própria estratégia.

Cobertura manual assistida de futuros entre períodos

Hedging de futuros entre períodos é uma estratégia muito comum. Como a frequência não é muito alta, muitas pessoas vão operá-la manualmente, exigindo que um contrato fique longo e um contrato fique curto, e eles podem analisar a tendência da diferença de preço. Usar plugins no seu terminal de negociação economizará energia.

A primeira coisa que quero apresentar é o plug-in de diferença de preço entre períodos:

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
}

Com um clique, você pode ver os spreads interperíodos recentes rapidamente. Endereço da cópia do código-fonte do plugin: https://www.fmz.com/strategy/187755 Use plug-ins de terminal de negociação para facilitar a negociação manual

Com a análise de spread, você descobre que o spread está convergindo, o que é uma oportunidade de vender a descoberto o contrato trimestral e comprar a semana atual. Neste momento, você pode usar o plug-in de hedge de um clique. Com um clique, ele irá automaticamente ajudam você a vender a descoberto o contrato trimestral e a comprar a semana atual, o que é mais rápido do que a operação manual. Bastantes. O princípio de implementação da estratégia é abrir o mesmo número de posições com slippage. Você pode executá-la várias vezes para atingir lentamente a posição necessária e evitar impactar o mercado. Você pode alterar os parâmetros padrão para colocar ordens mais rapidamente. Endereço da cópia da estratégia: 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())
}

Enquanto espera a diferença de preço convergir, se precisar fechar a posição, você pode executar o plug-in de fechamento de um clique para fechar a posição na velocidade mais rápida.


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

Negociação à vista assistida

O mais comum é o iceberg order, que divide pedidos grandes em pedidos pequenos. Embora possa ser executado como um robô, um plug-in de 5 minutos é, na verdade, suficiente. Existem dois tipos de ordens iceberg, uma é pegar a ordem e a outra é fazer a ordem. Se houver um desconto na taxa de manuseio, você pode escolher fazer a ordem, o que significa que o tempo de execução será maior.

O código a seguir é o código-fonte do plug-in de compra de ordens Iceberg: https://www.fmz.com/strategy/191771. Vender código fonte: 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
        }
        
    }
}

Ocupar sempre o preço de comprar um ou vender um também é uma maneira de enviar mercadorias lentamente, o que tem um impacto relativamente pequeno no mercado. Ainda há algumas áreas para melhoria nesta estratégia. Você pode alterar manualmente o volume mínimo de transação ou a precisão. Comprar: https://www.fmz.com/strategy/191582 Vender: 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)
    }
}

Às vezes, para vender a um preço melhor ou esperar por uma pechincha, você pode fazer vários pedidos em um determinado intervalo. Este plugin também pode ser usado para ordens futuras pendentes. Endereço da cópia do código-fonte: 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'
}

Negociação assistida de futuros de commodities

Os softwares de negociação de futuros comumente usados ​​geralmente têm muitas funções avançadas de colocação de ordens, como colocação de ordens stop-loss, colocação de ordens condicionais, etc., que podem ser facilmente gravadas em plug-ins. Este é um plug-in que permite fechar uma ordem pendente imediatamente após ela ser executada. Endereço para cópia: 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)
    }
}

Resumir

Depois de ver tantas funções pequenas, você deve ter suas próprias ideias. Você pode muito bem escrevê-las em plug-ins para facilitar sua negociação manual.