Escrever uma ferramenta de negociação semi-automática usando a linguagem Pine

Autora:Lydia., Criado: 2022-11-08 09:56:48, Atualizado: 2023-09-15 20:52:26

img

Embora haja mais e mais comerciantes que escrevem programas para negociação totalmente automatizada, o maior grupo de comerciantes ainda é de comerciantes manuais. Na verdade, os comerciantes subjetivos manuais também podem escrever pequenas ferramentas para ajudá-los em sua negociação subjetiva. Por exemplo, às vezes você encontra uma boa posição de entrada e planeja definir um stop loss fixo e trailing profit na posição inicial. Em seguida, dispensar as coisas mais intensivas em energia, como o monitoramento subsequente do mercado, siga seu próprio plano estabelecido de stop loss e take-profit exatamente, e deixe o programa fazer o monitoramento do mercado para você.

Projeto de parâmetros

A estratégia para projetar tais requisitos usando a linguagem Pine é muito simples. Os seguintes parâmetros precisam ser projetados para alcançar a função de acordo com os requisitos:

  1. Compartilhamento: quando é acionada uma linha de stop profit, a distância de compensação para compensar o preço mais alto e o preço mais baixo para delimitar a linha de stop profit.
  2. Limite: Parâmetros utilizados para controlar - A. Posição de base inicial para comprar diretamente, B. Preço especificado para esperar para comprar, C. Não fazer nada.
  3. O montante é o montante das ordens realizadas quando a posição de base é aberta.
  4. Perda: pontos de stop loss.
  5. O preço de saída é o preço de saída do mercado, que é o preço de saída do mercado.
  6. MinTick: A unidade mínima de flutuação de preços.
  7. Direção: Direção de abertura da posição de base.

Projeto de estratégia

/*backtest
start: 2022-09-24 00:00:00
end: 2022-09-27 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
args: [["v_input_1",20],["v_input_2",0],["v_input_4",50],["v_input_5",20],["RunMode",1,358374],["ZPrecision",0,358374],["XPrecision",3,358374]]
*/

strategy("Tracking loss and profit stopping entrustment", overlay = true)

varip targetPrice = na
varip high_lowPrice = na
varip isTrade = false 
varip isAlert = false
varip isAlertMinTick = false
varip isAlertFinished = false 

varip offset = input(30, "offset", "Tracking stop loss and stop profit offset")
varip limit = input(-1, "limit", "Initial opening price: - 1 means no opening, 0 means immediate opening, and other specific values are price limits")
varip amount = input(1, "amount", "amount of opening positions")
varip loss = input(30, "loss", "stop loss")
varip targetOffset = input(30, "targetOffset", "trigger tracking profit and loss stop offset")
varip minTick = input(1, "minTick", "the minimum unit of price fluctuation")
tradeType = input.string("long", "direction", tooltip="order direction, long: go long, short: go short", options=["long", "short"])

if not barstate.ishistory and not isAlertMinTick
    runtime.log("check whether syminfo.mintick is correct! syminfo.mintick:", syminfo.mintick, "#FF0000")
    if syminfo.mintick < minTick 
        runtime.error("system syminfo.mintick < minTick parameter", "#FF0000")
    isAlertMinTick := true 

if not barstate.ishistory and limit == -1 and not isAlert
    runtime.log("No open price is set, current limit is -1 (to prevent false openings, initial default limit is -1), openings are prohibited", "#FF0000")
    isAlert := true 

if isTrade and strategy.position_size == 0 and not isAlertFinished
    runtime.log("All order processes executed, position is 0", "#FF0000")
    isAlertFinished := true 

if not barstate.ishistory and not isTrade and limit != -1
    if limit == 0 
        strategy.entry("open", tradeType == "long" ? strategy.long : strategy.short, amount)
    else if limit > 0 
        strategy.entry("open", tradeType == "long" ? strategy.long : strategy.short, amount, limit=limit)
    
    if tradeType == "long"
        targetPrice := (limit == 0 ? close : limit) + targetOffset
    else 
        targetPrice := (limit == 0 ? close : limit) - targetOffset
    strategy.exit("exit", "open", amount, loss=loss, trail_price=targetPrice, trail_offset=offset)
    runtime.log("The price per point is:", syminfo.mintick, ", current close:", close)
    isTrade := true 

if ((close > targetPrice and strategy.position_size > 0) or (close < targetPrice and strategy.position_size < 0)) and not barstate.ishistory
    high_lowPrice := na(high_lowPrice) ? close : high_lowPrice
    if strategy.position_size > 0 
        high_lowPrice := close > high_lowPrice ? close : high_lowPrice
    else 
        high_lowPrice := close < high_lowPrice ? close : high_lowPrice

plot(targetPrice, "trail_price trigger line")    
plot(strategy.position_size!=0 ? high_lowPrice : na, "current highest/lowest price")
plot(strategy.position_size!=0 ? (strategy.position_size > 0 ? high_lowPrice-syminfo.mintick*offset : high_lowPrice+syminfo.mintick*offset) : na, "moving stop loss trigger line")

A concepção da estratégia não é complicada, mas deve ser definida como um "modelo de preços em tempo real", porque o preço deve ser monitorizado a todo momento.

img

Observe que o stop loss é expresso em pontos (minTick) e o offset também é expresso em pontos (minTick). O offset da linha de gatilho do stop profit trailing targetOffset é expresso em termos de distância de preço (por exemplo, definido em 30, que é RMB30 para distância). Quando o minTick é 1, 30 significa RMB30 para distância.

Esta estratégia de comissão é projetada para permitir que não só as posições base iniciais sejam longas, mas também as posições base iniciais sejam curtas.

Vamos demonstrar a implementação do projeto da seguinte forma:

1. Quando a estratégia estiver em execução, a posição de base será aberta e inserida imediatamente, e então o stop loss e tracking stop profit serão definidos de acordo com os parâmetros.

img

direcção é definida em longo, o parâmetro limite é definido em 0, ou seja, deixe a estratégia entrar e ir longo imediatamente quando ele é executado, o valor é definido em 1, ou seja, a estratégia abrir uma posição de 1 contrato.

img

2. Especificar o parâmetro limite, especificar o preço de entrada

As outras definições dos parâmetros permanecem inalteradas, exceto que o preço limite do parâmetro especificado é: 1276

img

O parâmetro limite padrão é -1, que não opera nada e impede a abertura acidental de posições

img

O FIM

Quando se utiliza a estratégia da linguagem Pine, é importante prestar especial atenção aos dados do minTick.

img

O parâmetro Pricing Currency Accuracy é definido como 0, o que significa que o valor dos dados de preço é preciso a um único dígito (ou seja, 0 casas decimais).

OK, o acima é todo o design desta estratégia de comissão semi-automática, embora eu também o use para negociação real-bot. Mas tais ferramentas também devem ser usadas de acordo com seus próprios hábitos de negociação para entender, modificações específicas, otimização pode ser realizada por si mesmo. Aqui o código de estratégia é apenas para compartilhamento público, design de aprendizado de troca e lógica.

Como podemos ver, a linguagem Pine é muito fácil de usar, e é conveniente e fácil de aprender. Podemos usar a linguagem Pine para projetar as ferramentas que queremos rapidamente, sem ter que se preocupar com programação complicada, e usar a linguagem Pine para tornar a negociação quantitativa mais fácil na plataforma de negociação quantitativa FMZ.


Relacionados

Mais.