가장 좋은 후속 취득 전략

저자:차오장, 날짜: 2023-10-07 10:28:54
태그:

전반적인 설명

이 전략의 주요 아이디어는 빠른 MA가 느린 MA를 넘어서면 긴 거리를 이동하고, 빠른 MA가 느린 MA를 넘어서면 짧은 거리를 이동하고, 포지션에 진입한 후 후속 영업이익을 설정하는 것입니다. 가격이 영업이익 라인에 도달하면 후속 영업이익을 유발하고, 영업이익을 극대화하기 위해 지속적으로 영업이익 라인을 조정합니다.

전략 논리

이 전략은 다음과 같은 주요 부분으로 구성됩니다.

  1. 빠른 이동 평균과 느린 이동 평균을 계산합니다. 빠른 MA 기간은 20이고 느린 MA 기간은 50입니다.

  2. 진입 조건을 결정합니다. 빠른 MA가 느린 MA를 넘을 때 길게, 빠른 MA가 느린 MA를 넘을 때 짧게.

  3. 트렌드 방향을 결정합니다. 긴 신호와 짧은 신호에서 바 수를 기록하고, 상승 추세인지 하락 추세인지 판단합니다.

  4. 입력 가격. 입력 가격으로 트레이딩 신호가 발생했을 때 가격을 기록합니다.

  5. 수익을 취하는 라인을 설정합니다. 장래 거래의 경우 수익을 취하는 비율은 높습니다 * (1 + 수익을 취하는 비율); 쇼트 거래의 경우 수익을 취하는 비율은 낮습니다 * (1 - 수익을 취하는 비율).

  6. 이윤을 추월합니다. 이윤을 추월하는 선은 계속 조정되고 수익성 방향으로 고정된 비율로 움직입니다.

  7. 이윤 트리거를 가져가면 가격에 도달하면 이윤 라인을 가져가고, 수익을 위해 포지션을 닫습니다.

  8. 또한 선택적인 활성화 기능이 있습니다. 가격이 처음으로 활성화 수준을 통과 할 때만 후속 취득이 활성화됩니다.

이점 분석

이 전략의 가장 큰 장점은 이윤을 추월하여 이윤을 극대화하는 것입니다. 가격이 유리한 방향으로 움직일 때, 이윤을 확보하기 위해 이윤 라인은 유리한 방향으로 계속 움직입니다.

또한 MA 크로스오버로 트렌드 필터링을 추가하여 트렌드가 아닌 시장에서 불필요한 위프사우를 피합니다. 활성화 기능은 작은 가격 변동으로 수익을 취하는 것을 피합니다.

트렌드, 엔트리, 리프트를 결합함으로써, 트렌드를 타고 지속적으로 수익을 창출하고 수익을 극대화할 수 있습니다.

위험 분석

주요 위험은 이윤을 얻기 위해 적절한 가격 움직임이 필요하다는 것입니다. 가격이 빠르게 역전되면 손실이 발생할 수 있습니다.

또한 불안한 시장에서 자주 수익을 취하는 것은 손실을 초래할 수 있습니다.

그리고 너무 높은 수익률과 같은 부적절하게 설정된 매개 변수는 위험을 증가시킬 수 있습니다.

적절한 수익률을 설정하거나 불안한 시장에서 거래를 피하거나 스톱 로스를 사용하여 위험을 관리할 수 있습니다.

최적화

이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.

  1. 더 나은 조합을 찾기 위해 다른 기간을 테스트하여 MA 매개 변수를 최적화합니다.

  2. 다양한 활성화 레벨을 테스트하여 활성화 기능을 최적화합니다.

  3. 백테스팅을 통해 수익률을 최적화합니다.

  4. 적정 수준에서 스톱 로스를 추가하여 위험을 조절합니다.

  5. 부피, ATR 정지 등과 같은 추가 필터를 테스트합니다.

  6. 주식, 외환, 암호화폐 등 다양한 시장에서 테스트합니다.

결론

이 전략은 트렌드, 엔트리, 트래일링 취득과 같은 여러 모듈을 통합하여 트렌드를 타고 수익을 극대화합니다. 그러나 위험을 관리해야하며, 혼란스러운 시장을 피하고, 사용하기 전에 매개 변수를 최적화해야합니다. 그것은 트래일링 취득을 통해 더 큰 이익을 얻는 아이디어를 제공합니다.


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

더 많은