Chiến lược chốt lời theo sau tốt nhất


Ngày tạo: 2023-10-07 10:28:54 sửa đổi lần cuối: 2023-10-07 10:28:54
sao chép: 1 Số nhấp chuột: 742
1
tập trung vào
1617
Người theo dõi

Tổng quan

Ý tưởng chính của chiến lược này là sử dụng đồng line gold fork làm nhiều, đồng line dead fork làm trống, và sau khi vào vị trí, thiết lập tracking stop. Khi giá đạt đến đường dừng được chỉ định, sẽ kích hoạt tracking stop, liên tục điều chỉnh đường dừng để tối đa hóa lợi nhuận.

Nguyên tắc chiến lược

Chiến lược này bao gồm:

  1. Tính toán đường trung bình nhanh và đường trung bình chậm. Ở đây chu kỳ đường trung bình nhanh là 20, chu kỳ đường trung bình chậm là 50.

  2. Đánh giá điều kiện nhập học: Làm nhiều hơn khi đi trên đường trung bình nhanh; làm trống khi đi dưới đường trung bình nhanh.

  3. Đánh giá xu hướng của xu hướng. Ghi lại số thanh làm nhiều và làm rỗng, đánh giá xu hướng hiện tại là xu hướng nhiều đầu hoặc xu hướng không đầu.

  4. Giá vào. Giá được ghi lại khi tín hiệu giao dịch được phát ra là giá vào.

  5. Thiết lập dây dừng. Khi bạn làm quá nhiều, nó sẽ ở điểm cao(1 + Stop Stop Percentage) làm Stop Stop; trong thời gian làm空, sẽ ở mức thấp(1-tỷ lệ phần trăm) như là ngưng.

  6. Theo dõi dừng. Đường dừng sẽ được điều chỉnh liên tục, khi di chuyển theo hướng thuận lợi, tiếp tục di chuyển theo hướng thuận lợi với tỷ lệ cố định, để tối đa hóa lợi nhuận.

  7. Đường dừng được kích hoạt. Khi giá chạm vào đường dừng, lệnh dừng được đặt.

  8. Ngoài ra còn có một tùy chọn khởi động. Đó là thiết lập một đường dừng khởi động, chỉ khi giá lần đầu tiên vượt qua đường này, nó sẽ kích hoạt dừng theo dõi.

Lợi thế chiến lược

Lợi thế lớn nhất của chiến lược này là sử dụng các trạm dừng theo dõi để tối đa hóa lợi nhuận. Khi thị trường hoạt động theo hướng thuận lợi, các đường dừng sẽ liên tục di chuyển theo hướng thuận lợi để đảm bảo lợi nhuận.

Ngoài ra, chiến lược này đã thêm vào bộ lọc xu hướng của sự phán đoán trung bình, có thể làm giảm việc mở vị trí lặp đi lặp lại vô ích trong thị trường không có xu hướng. Việc thêm vào chức năng khởi động cũng có thể giúp tránh các biến động giá nhỏ kích hoạt dừng theo dõi.

Vì vậy, chiến lược này tích hợp nhiều khía cạnh của việc đánh giá xu hướng, điều kiện nhập cảnh và chiến lược dừng để có thể kiếm được lợi nhuận liên tục và tối đa hóa lợi nhuận trong tình trạng xu hướng.

Rủi ro chiến lược

Rủi ro chính của chiến lược này là phải có đủ không gian để thực hiện dừng. Nếu thị trường quay trở lại rất nhanh, có thể gây thiệt hại.

Ngoài ra, trong trường hợp động đất, việc kích hoạt thường xuyên dây dừng có thể gây ra thiệt hại.

Cuối cùng, nếu các tham số được thiết lập không đúng cách, chẳng hạn như tỷ lệ ngăn chặn quá lớn, nguy cơ cũng sẽ tăng lên.

Bạn có thể kiểm soát rủi ro bằng cách thiết lập tỷ lệ dừng hợp lý, tránh giao dịch trong tình trạng biến động hoặc thiết lập dừng lỗ.

Tối ưu hóa chiến lược

Chiến lược này có thể được tối ưu hóa bằng cách:

  1. Tối ưu hóa tham số trung bình. Bạn có thể thử nghiệm các tham số chu kỳ trung bình khác nhau để tìm một sự kết hợp phù hợp hơn.

  2. Tối ưu hóa chức năng khởi động. Bạn có thể thử các kích cỡ khởi động khác nhau để tìm các thiết lập phù hợp hơn.

  3. Tối ưu hóa tỷ lệ dừng. Bạn có thể tìm các tham số tỷ lệ dừng phù hợp hơn bằng cách phản hồi.

  4. Thêm dừng. Thiết lập vị trí dừng hợp lý, kiểm soát rủi ro.

  5. Tối ưu hóa các điều kiện lọc. Bạn có thể thử nghiệm thêm các điều kiện lọc khác, chẳng hạn như khối lượng giao dịch, dừng ATR, v.v.

  6. Tối ưu hóa vật thể của biểu tượng. Có thể thử nghiệm trong các biểu tượng giao dịch khác nhau như cổ phiếu, ngoại hối, tiền điện tử.

Tóm tắt

Chiến lược này tích hợp nhiều mô-đun chiến lược như phán đoán xu hướng, điều kiện tham gia, theo dõi các điểm dừng, và trong tình huống có xu hướng, có thể theo dõi các điểm dừng liên tục để tối đa hóa lợi nhuận. Tuy nhiên, phải kiểm soát rủi ro tốt, tránh sử dụng trong tình huống chấn động và tối ưu hóa tham số để có thể thực hiện tác dụng tối đa của chiến lược. Chiến lược này cung cấp cho chúng tôi một cách sử dụng theo dõi các điểm dừng để có được lợi nhuận lớn hơn.

Mã nguồn chiến lược
/*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