Melhor estratégia de Trailing Take Profit


Data de criação: 2023-10-07 10:28:54 última modificação: 2023-10-07 10:28:54
cópia: 1 Cliques: 742
1
focar em
1617
Seguidores

Visão geral

A ideia principal desta estratégia é usar um forquinho de linha uniforme para fazer o over, um forquinho de linha uniforme para fechar, e depois de entrar em posição, configurar o tracking stop. Quando o preço atinge o limite de parada especificado, o tracking stop é acionado, ajustando continuamente o limite de parada para maximizar o lucro.

Princípio da estratégia

A estratégia é dividida em várias partes:

  1. Calcule a média rápida e a média lenta. A média rápida tem um período de 20 anos e a média lenta tem um período de 50 anos.

  2. Para avaliar os requisitos de entrada, faça mais na linha média rápida e faça espaço na linha média lenta abaixo da linha média rápida.

  3. Determine a direção da tendência. Registre o número de barras de over and under, e determine se a tendência atual é de múltiplos ou de curto prazo.

  4. Preço de entrada. O preço registrado no momento da emissão do sinal de negociação é o preço de entrada.

  5. Configure o parâmetro de suspensão.(1 + percentual de suspensão) como suspensão; quando estiver em branco, estará em um ponto baixo(1-percentual de suspensão) como suspensão.

  6. A linha de parada é continuamente ajustada e, ao se mover na direção favorável, continua a se mover na direção favorável em porcentagens fixas para maximizar o lucro.

  7. A linha de paragem é acionada. Quando o preço toca a linha de paragem, a posição é parada.

  8. Há também uma função de inicialização opcional. Esta função é definida como um limite de inicialização que só será acionado quando o preço ultrapassar esse limite pela primeira vez.

Vantagens estratégicas

A maior vantagem dessa estratégia é que ela usa o rastreamento de paradas para maximizar o lucro. Quando o mercado funciona em uma direção favorável, a linha de paradas se move continuamente para a direção favorável, garantindo lucro.

Além disso, a estratégia inclui um filtro de tendência de avaliação de linha média, o que reduz a repetição desnecessária de posições em mercados fora de tendência. A inclusão de uma função de inicialização também evita que pequenas oscilações de preço desencadeiem um stop de rastreamento.

Portanto, esta estratégia integra vários aspectos de discernimento de tendências, condições de entrada e estratégias de parada, permitindo obter lucros sustentáveis e maximizar os lucros em situações de tendências.

Risco estratégico

O principal risco desta estratégia é que deve haver espaço suficiente para que a paralisação ocorra. Se a paralisação ocorrer rapidamente, pode haver perdas.

Além disso, o uso frequente de cabos de retenção pode causar danos em situações de tremores.

Por fim, se os parâmetros forem mal definidos, como por exemplo, se a proporção de estímulo for muito grande, o risco também aumenta.

O risco pode ser controlado através de um racional Stop Loss Ratio, evitando a negociação em situações de turbulência, ou através de um Stop Loss.

Otimização de Estratégia

A estratégia pode ser otimizada em vários aspectos:

  1. Optimização dos parâmetros da linha média. Pode-se testar diferentes parâmetros do ciclo da linha média para encontrar a combinação mais adequada.

  2. Optimizar a função de arranque. Você pode testar diferentes tamanhos de barra de arranque e encontrar a configuração mais adequada.

  3. Otimização da proporção de travamento. Pode-se encontrar um parâmetro de proporção de travamento mais adequado através de feedback.

  4. Adição de stop loss. Estabelecer uma posição de stop loss razoável e controlar o risco.

  5. Optimizar as condições de filtragem. Pode-se testar a adição de outras condições de filtragem, como volume de transação, stop loss ATR, etc.

  6. Otimização de itens. Pode ser testado em diferentes itens de negociação, como ações, divisas, criptomoedas, etc.

Resumir

Esta estratégia integra vários módulos de estratégia, como julgamento de tendências, condições de entrada e rastreamento de paradas. Em uma tendência, é possível rastrear paradas continuamente para maximizar o lucro. Mas é necessário controlar o risco, evitar o uso em situações de turbulência e otimizar os parâmetros para maximizar o efeito da estratégia.

Código-fonte da estratégia
/*backtest
start: 2023-01-01 00:00:00
end: 2023-10-06 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//@author=Daveatt

SystemName = "BEST Trailing Profit Strategy"
// This string is to personalize the text that appears with your orders on the chart through strategy() calls and entry/exit markers, and in the alert default message.
// Although leaving it empty will not cause problems in study mode,
TradeId = "BEST"
// These values are used both in the strategy() header and in the script's relevant inputs as default values so they match.
// Unless these values match in the script's Inputs and the TV backtesting Properties, results between them cannot be compared.
InitCapital = 1000000
InitPosition = 100
InitCommission = 0.075
InitPyramidMax = 1
CalcOnorderFills = true
CalcOnTick = true
DefaultQtyType = strategy.fixed
DefaultQtyValue = strategy.fixed
Precision = 2
Overlay=true

// strategy(title=SystemName, shorttitle=SystemName, overlay=Overlay, 
//  pyramiding=InitPyramidMax, initial_capital=InitCapital, default_qty_type=DefaultQtyType, default_qty_value=InitPosition, commission_type=strategy.commission.percent, 
//  commission_value=InitCommission, calc_on_order_fills=CalcOnorderFills, calc_on_every_tick=CalcOnTick, precision=2)


// strategy(title=SystemName, shorttitle=SystemName, overlay=true, 
//  pyramiding=0, default_qty_value=100, precision=7, currency=currency.USD,
//  commission_value=0.2,commission_type=strategy.commission.percent, initial_capital=10000)

//
//  Author:   Daveatt
//  Revision: R0.1 Beta
//  Date:     8-Dec-2019
//

// inputs

src   = input(defval=close, type=input.source, title="Source")

slowLength   = input(20, "Fast Length",minval=2,step=1)
fastLength   = input(50, "Fast Length",minval=2,step=1)

// Calculate moving averages
fastSMA = sma(src, slowLength)
slowSMA = sma(src, fastLength)

// Calculate trading conditions
enterLong  = crossover(fastSMA, slowSMA)
enterShort = crossunder(fastSMA, slowSMA)

// trend states
since_buy  = barssince(enterLong)
since_sell = barssince(enterShort)
buy_trend  = since_sell > since_buy
sell_trend = since_sell < since_buy 

change_trend = (buy_trend and sell_trend[1]) or (sell_trend and buy_trend[1])

// get the entry price
entry_price = valuewhen(enterLong or enterShort, src, 0)

// Plot moving averages
plot(series=fastSMA, color=color.teal)
plot(series=slowSMA, color=color.orange)

// Plot the entries
plotshape(enterLong, style=shape.circle, location=location.belowbar, color=color.green, size=size.small)
plotshape(enterShort, style=shape.circle, location=location.abovebar, color=color.red, size=size.small)



///////////////////////////////
//======[ Take Profit ]======//
///////////////////////////////

// Use TP?
useTP = input(true, "Use take profit")
// TP trailing
ProfitTrailPerc     = input(1.0, "Trailing Profit (%)",minval=0,step=0.5,type=input.float) * 0.01

use_TP_Trigger = input(true, "Use Take Profit Trigger")
// Will trigger the take profit trailing once reached
takeProfitTrigger   = input(3.0, "Take Profit Trigger (%)",minval=0,step=0.5,type=input.float) * 0.01


// ttp := ttp>tp ? tp : ttp

takeprofitPriceTrigger = 0.0
takeprofitPriceTrigger := if (use_TP_Trigger)
    if (buy_trend)
        entry_price * (1 + takeProfitTrigger) 
    else
        entry_price * (1 - takeProfitTrigger)
else
    -1

//plot(entry_price, title='entry_price', transp=100)

var TP_Trigger_Long_HIT = false
TP_Trigger_Long_HIT := useTP and use_TP_Trigger and buy_trend and high >= takeprofitPriceTrigger
 ? true : TP_Trigger_Long_HIT[1]


var TP_Trigger_Short_HIT = false
TP_Trigger_Short_HIT := useTP and use_TP_Trigger and sell_trend and low <= takeprofitPriceTrigger
 ? true : TP_Trigger_Short_HIT[1]


display_long_TP_trigger     = useTP and buy_trend  and TP_Trigger_Long_HIT == false 
 and takeprofitPriceTrigger != -1
display_short_TP_trigger    = useTP and sell_trend and TP_Trigger_Short_HIT == false 
 and takeprofitPriceTrigger != -1
display_TP_trigger          = display_long_TP_trigger or display_short_TP_trigger


//🔷🔷🔷
// @hugo: Will display the TP trigger as long as not hit
// once the TP trigger is hit, the TP trailing will activate
plot(display_TP_trigger ? takeprofitPriceTrigger : na, title='takeprofitPriceTrigger', transp=0, color=color.orange, 
 style=plot.style_cross, linewidth=3)

longTrailTP= 0.0, shortTrailTP = 0.0

// Trailing Profit
// Start trailing once trigger is reached
longTrailTP := if useTP and buy_trend 
    tpValue = high * (1 + ProfitTrailPerc)
    max(tpValue, longTrailTP[1])
else
    0

shortTrailTP := if useTP and sell_trend
    tpValue = low * (1 - ProfitTrailPerc)
    min(tpValue, shortTrailTP[1])
else
    999999

//plot(longTrailTP, title='debug longTrailTP', transp=100)
//plot(shortTrailTP, title='debug shortTrailTP', transp=100)

//////////////////////////////////////////////////////////////////////////////////////////
//*** TRAILING TAKE PROFIT HIT CONDITIONS TO BE USED IN ALERTS  ***//
//////////////////////////////////////////////////////////////////////////////////////////


//🔷🔷🔷
// @hugo: I use crossover/crossunder for the alerts to trigger the events only once
cond_long_trail_tp_hit      = useTP and buy_trend   and crossover(high, longTrailTP[1]) 
 and (TP_Trigger_Long_HIT or use_TP_Trigger == false)
cond_short_trail_tp_hit     = useTP and sell_trend  and crossunder(low, shortTrailTP[1]) 
 and (TP_Trigger_Short_HIT or use_TP_Trigger == false)
// 🔷🔷🔷


// Plot take profits values for confirmation
// Display the trailing TP until not hit
plot(series= useTP and buy_trend and high <= longTrailTP and 
 (TP_Trigger_Long_HIT or use_TP_Trigger == false) ? longTrailTP : na,
 color=color.aqua, style=plot.style_circles,
 linewidth=2, title="Long Trail TP")

plot(series= useTP and sell_trend and low >= shortTrailTP and 
 (TP_Trigger_Short_HIT or use_TP_Trigger == false) ? shortTrailTP : na,
 color=color.aqua, style=plot.style_circles,
 linewidth=2, title="Short Trail TP")


close_long  = cond_long_trail_tp_hit
close_short = cond_short_trail_tp_hit

// Submit entry orders
strategy.entry("EL", long=true, when=enterLong)
strategy.close("EL", when=close_long)

//if (enterShort)
strategy.entry("ES", long=false, when=enterShort)
strategy.close("ES", when=close_short)


///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////// ALERTS ////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////
//* Put Entry Alerts below *//
//////////////////////////////

// IN STUDY MODE ONLY

// ⚠️⚠️⚠️ For alerts on the signal itself ⚠️⚠️⚠️
//alertcondition(buy_event, "Open Long", "LONG")
//alertcondition(sell_event, "Open Short", "SHORT")

// For the closes you will want to trigger these alerts on condition with alert 
// option "Once Per Bar" for TP and SL

if change_trend
    TP_Trigger_Long_HIT := false
    TP_Trigger_Short_HIT := false