Escribir una herramienta de comercio semiautomático utilizando el lenguaje Pine

El autor:- ¿ Por qué?, Creado: 2022-11-08 09:56:48, Actualizado: 2023-09-15 20:52:26

img

Aunque hay más y más comerciantes que escriben programas para el comercio totalmente automatizado, el grupo más grande de comerciantes todavía son comerciantes manuales. De hecho, los comerciantes subjetivos manuales también pueden escribir pequeñas herramientas para ayudarlos en su comercio subjetivo. Por ejemplo, a veces encuentras una buena posición de entrada y planeas establecer una parada de pérdida fija y ganancias de seguimiento en la posición inicial. Luego prescinde de las cosas más intensivas en energía como el monitoreo posterior del mercado, sigue exactamente tu propio plan de pérdida de parada y ganancias de seguimiento, y deja que el programa haga el monitoreo del mercado por ti.

Diseño de parámetros

La estrategia para diseñar tales requisitos mediante el lenguaje Pine es muy simple. Los siguientes parámetros deben diseñarse para lograr la función de acuerdo con los requisitos:

  1. Compensación: cuando se activa una línea de stop profit, la distancia de compensación para compensar el precio más alto y el precio más bajo para delimitar la línea de stop profit.
  2. límite: Parámetros utilizados para controlar - A. Posición base inicial para comprar directamente, B. Precio especificado para esperar a comprar, C. No hacer nada.
  3. En el caso de las posiciones de base, el importe de las órdenes emitidas en el momento de la apertura de la posición de base.
  4. Pérdida: puntos de parada de pérdida.
  5. En el caso de las operaciones de negociación, el valor de las operaciones de negociación es el valor de las operaciones de negociación.
  6. MinTick: Unidad mínima de fluctuación de precios.
  7. Dirección: Dirección de apertura de la posición de base.

Diseño de la estrategia

/*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")

El diseño de la estrategia no es complicado, pero debe establecerse como un "modelo de precios en tiempo real", ya que el precio debe ser monitoreado en todo momento.

img

Tenga en cuenta que el stop loss se expresa en puntos (minTick) y el desplazamiento también se expresa en puntos (minTick). El desplazamiento de la línea de activación del stop profit de trailing targetOffset se expresa en términos de distancia de precio (por ejemplo, establecido en 30, que es RMB30 para la distancia). Cuando el minTick es 1, 30 significa RMB30 para la distancia.

Esta estrategia de comisión está diseñada para permitir no solo que las posiciones base iniciales vayan largas, sino también que las posiciones base iniciales vayan cortas.

Demostremos la implementación del diseño de la siguiente manera:

1. Cuando la estrategia se está ejecutando, la posición base se abrirá e ingresará inmediatamente, y luego se establecerá el stop loss y el stop profit de seguimiento de acuerdo con los parámetros.

img

Dirección se establece en largo, el parámetro límite se establece en 0, es decir, dejar que la estrategia entrar y ir largo inmediatamente cuando se está ejecutando, el monto se establece en 1, es decir, la estrategia abrir una posición de 1 contrato.

img

2. Especifique el parámetro límite, especifique el precio de entrada

Los demás parámetros se mantienen sin cambios, excepto que el precio límite del parámetro especificado es: 1276

img

El parámetro límite predeterminado es -1, que no opera nada y evita la apertura accidental de posiciones

img

El fin.

Cuando se utiliza la estrategia del lenguaje Pine, es importante prestar especial atención a los datos de minTick. El número exacto de minTick de precios en el sistema está relacionado con la precisión de la moneda de precios en el parámetro.

img

El parámetro Pricing Currency Accuracy está establecido en 0, lo que significa que el valor de los datos de precios es preciso hasta un solo dígito (es decir, 0 decimales).

OK, lo anterior es todo el diseño de esta estrategia de comisión semiautomática, aunque también lo uso para el comercio de robots reales. Pero tales herramientas también deben usarse de acuerdo con sus propios hábitos comerciales para entender, modificaciones específicas, la optimización se puede llevar a cabo por su cuenta. Aquí el código de estrategia es sólo para el intercambio público, diseño de aprendizaje de intercambio y lógica.

Como podemos ver, el lenguaje Pine es muy fácil de usar, y es conveniente y fácil de aprender. Podemos usar el lenguaje Pine para diseñar las herramientas que queremos rápidamente, sin tener que preocuparnos por la programación complicada, y usar el lenguaje Pine para hacer el comercio cuantitativo más fácil en FMZ Quantitative Trading Platform.


Relacionados

Más.