O recurso está a ser carregado... Carregamento...

Inventor de Tutoriais de Introdução à Língua PINE

Autora:Inventor quantificado - sonho pequeno, Criado: 2022-05-30 16:23:43, Atualizado: 2022-09-28 17:10:21

Não, não é. Dois, três.trail_offsetParâmetros: Após a execução do ato de stop-loss stop-loss, a distância entre o preço mais alto (excesso de tempo) ou o preço mais baixo (escancaramento) é colocada no plano de equilíbrio. Três.trail_pointsParâmetros:trail_priceParâmetros, mas apenas posições especificadas com o número de vantagens de um eixo.

Não é fácil de entender, não importa! Vamos entender a aprendizagem através de uma estratégia de retrospecção de cenários, que é simples.

/*backtest
start: 2022-09-23 00:00:00
end: 2022-09-23 08:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["RunMode",1,358374],["ZPrecision",0,358374]]
*/

strategy("test", overlay = true)

varip a = na
varip highPrice = na
varip isTrade = false 
varip offset = 30

if not barstate.ishistory and not isTrade
    strategy.entry("test 1", strategy.long, 1)
    strategy.exit("exit 1", "test 1", 1, trail_price=close+offset, trail_offset=offset)
    a := close + offset
    runtime.log("每点价格为:", syminfo.mintick, ",当前close:", close)
    isTrade := true 

if close > a and not barstate.ishistory
    highPrice := na(highPrice) ? close : highPrice
    highPrice := close > highPrice ? close : highPrice

plot(a, "trail_price 触发线")    
plot(strategy.position_size>0 ? highPrice : na, "当前最高价")
plot(strategy.position_size>0 ? highPrice-syminfo.mintick*offset : na, "移动止损触发线")

img

img

img

A estratégia é executada imediatamente após a entrada de múltiplos cabeçalhos e logo após a próxima entrada.strategy.exitA ordem de saída (parâmetros de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem de paragem

Então nós usamos essa função para otimizar uma estratégia de super-trend, e nós apenas designamos uma ordem de entrada para a estratégia.strategy.exitA lista de eventos pode ser adicionada a esta função de rastreamento e bloqueio de perdas.

if not barstate.ishistory and findOrderIdx("open") >= 0 and state == 1
    trail_price := strategy.position_size > 0 ? close + offset : close - offset
    strategy.exit("exit", "open", 1, trail_price=trail_price, trail_offset=offset)
    runtime.log("每点价格为:", syminfo.mintick, ",当前close:", close, ",trail_price:", trail_price)
    state := 2 
    tradeBarIndex := bar_index

O código completo da estratégia:

/*backtest
start: 2022-05-01 00:00:00
end: 2022-09-27 00:00:00
period: 1d
basePeriod: 5m
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
args: [["RunMode",1,358374],["ZPrecision",0,358374]]
*/

varip trail_price = na
varip offset = input(50, "offset")
varip tradeBarIndex = 0
// 0 : idle , 1 current_open , 2 current_close
varip state = 0  

findOrderIdx(idx) =>
    ret = -1 
    if strategy.opentrades == 0 
        ret
    else 
        for i = 0 to strategy.opentrades - 1 
            if strategy.opentrades.entry_id(i) == idx
                ret := i 
                break
        ret

if strategy.position_size == 0 
    trail_price := na 
    state := 0

[superTrendPrice, dir] = ta.supertrend(input(2, "atr系数"), input(20, "atr周期"))

if ((dir[1] < 0 and dir[2] > 0) or (superTrendPrice[1] > superTrendPrice[2])) and state == 0 and tradeBarIndex != bar_index
    strategy.entry("open", strategy.long, 1)
    state := 1
else if ((dir[1] > 0 and dir[2] < 0) or (superTrendPrice[1] < superTrendPrice[2])) and state == 0 and tradeBarIndex != bar_index
    strategy.entry("open", strategy.short, 1)
    state := 1


// 反向信号,全平
if strategy.position_size > 0 and dir[2] < 0 and dir[1] > 0
    strategy.cancel_all()
    strategy.close_all()
    runtime.log("趋势反转,多头全平")
else if strategy.position_size < 0 and dir[2] > 0 and dir[1] < 0
    strategy.cancel_all()
    strategy.close_all()
    runtime.log("趋势反转,空头全平")


if not barstate.ishistory and findOrderIdx("open") >= 0 and state == 1
    trail_price := strategy.position_size > 0 ? close + offset : close - offset
    strategy.exit("exit", "open", 1, trail_price=trail_price, trail_offset=offset)
    runtime.log("每点价格为:", syminfo.mintick, ",当前close:", close, ",trail_price:", trail_price)
    state := 2 
    tradeBarIndex := bar_index


plot(superTrendPrice, "superTrendPrice", color=dir>0 ? color.red : color.green, overlay=true)

Mais.