Chiến lược lợi nhuận tốt nhất

Tác giả:ChaoZhang, Ngày: 2023-10-07 10:28:54
Tags:

Tổng quan

Ý tưởng chính của chiến lược này là đi dài khi MA nhanh vượt qua MA chậm, đi ngắn khi MA nhanh vượt qua dưới MA chậm, và đặt lợi nhuận sau khi nhập vào vị trí. Khi giá đạt đến đường thu lợi nhuận, nó sẽ kích hoạt đường thu lợi nhuận, liên tục điều chỉnh đường thu lợi nhuận để tối đa hóa lợi nhuận.

Chiến lược logic

Chiến lược bao gồm các phần chính sau:

  1. Tính toán các trung bình di chuyển nhanh và chậm.

  2. Xác định các điều kiện nhập cảnh. Đi dài khi MA nhanh vượt qua MA chậm, đi ngắn khi MA nhanh vượt qua dưới MA chậm.

  3. Xác định hướng xu hướng. ghi lại số thanh từ tín hiệu dài và ngắn, đánh giá xem đó là xu hướng tăng hay giảm.

  4. Giá đầu vào: ghi lại giá khi tín hiệu giao dịch được kích hoạt như giá đầu vào.

  5. Đặt các đường thu lợi nhuận. Đối với dài, thu lợi nhuận là cao * (1 + tỷ lệ lợi nhuận); cho ngắn, thu lợi nhuận là thấp * (1 - tỷ lệ lợi nhuận).

  6. Mức lợi nhuận tiếp tục được điều chỉnh, chuyển động theo tỷ lệ cố định ủng hộ hướng có lợi nhuận.

  7. Khi giá chạm đến đường lợi nhuận, đóng vị trí để kiếm lợi nhuận.

  8. Có một tính năng kích hoạt tùy chọn. Chỉ khi giá lần đầu tiên vượt qua mức kích hoạt, lợi nhuận sẽ được kích hoạt.

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược này là tối đa hóa lợi nhuận bằng cách theo dõi lợi nhuận. Khi giá di chuyển theo hướng thuận lợi, đường lợi nhuận tiếp tục di chuyển theo hướng thuận lợi để khóa lợi nhuận.

Nó cũng thêm bộ lọc xu hướng với các chéo MA để tránh những biến động không cần thiết trên các thị trường không có xu hướng.

Bằng cách kết hợp xu hướng, nhập, lấy lợi nhuận, nó có thể đi trên xu hướng để kiếm lợi nhuận liên tục và tối đa hóa lợi nhuận.

Phân tích rủi ro

Rủi ro chính là nó đòi hỏi sự chuyển động giá phù hợp để đạt được lợi nhuận.

Ngoài ra, việc thường xuyên lấy lợi nhuận trong thị trường hỗn loạn có thể gây ra tổn thất.

Và các thông số không đúng cách như tỷ lệ lợi nhuận quá cao có thể làm tăng rủi ro.

Rủi ro có thể được quản lý bằng cách thiết lập tỷ lệ lợi nhuận thích hợp, tránh giao dịch trên thị trường hỗn loạn hoặc sử dụng dừng lỗ.

Tối ưu hóa

Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:

  1. Tối ưu hóa các tham số MA bằng cách thử nghiệm các khoảng thời gian khác nhau để tìm kết hợp tốt hơn.

  2. Tối ưu hóa tính năng kích hoạt bằng cách thử nghiệm các mức kích hoạt khác nhau.

  3. Tối ưu hóa tỷ lệ lợi nhuận thông qua backtesting.

  4. Thêm stop loss ở mức thích hợp để kiểm soát rủi ro.

  5. Kiểm tra các bộ lọc bổ sung như âm lượng, dừng ATR v.v.

  6. Kiểm tra trên các thị trường khác nhau như cổ phiếu, ngoại hối, tiền điện tử.

Kết luận

Chiến lược này tích hợp nhiều mô-đun như xu hướng, nhập cảnh, lợi nhuận theo dõi để tối đa hóa lợi nhuận bằng cách đi theo xu hướng. Nhưng rủi ro phải được quản lý, tránh thị trường hỗn loạn, tối ưu hóa các tham số trước khi sử dụng. Nó cung cấp một ý tưởng về việc đạt được lợi nhuận lớn hơn thông qua lợi nhuận theo dõi.


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

Thêm nữa