Strategi Keuntungan Teratas

Penulis:ChaoZhang, Tarikh: 2023-10-07 10:28:54
Tag:

Ringkasan

Idea utama strategi ini adalah untuk pergi lama apabila MA pantas melintasi MA perlahan, pergi pendek apabila MA pantas melintasi di bawah MA perlahan, dan menetapkan keuntungan yang diambil selepas memasuki kedudukan.

Logika Strategi

Strategi ini terdiri daripada bahagian utama berikut:

  1. Hitung purata bergerak pantas dan perlahan. tempoh MA pantas adalah 20 dan tempoh MA perlahan adalah 50.

  2. Tentukan syarat kemasukan. pergi panjang apabila MA pantas melintasi MA perlahan, pergi pendek apabila MA pantas melintasi di bawah MA perlahan.

  3. Menentukan arah trend. Rekod bilangan bar sejak isyarat panjang dan pendek, menilai sama ada ia adalah aliran naik atau penurunan.

  4. Harga kemasukan. Mencatatkan harga apabila isyarat perdagangan dicetuskan sebagai harga kemasukan.

  5. Tetapkan garis mengambil keuntungan. Untuk panjang, mengambil keuntungan adalah pada tinggi * (1 + mengambil keuntungan peratusan); untuk pendek, mengambil keuntungan adalah pada rendah * (1 - mengambil keuntungan peratusan).

  6. Lini keuntungan mengambil terus menyesuaikan, bergerak peratusan tetap memihak arah yang menguntungkan.

  7. Apabila harga menyentuh garis keuntungan, tutup kedudukan untuk keuntungan.

  8. Terdapat juga ciri pengaktifan pilihan. Hanya apabila harga pertama memecahkan tahap pengaktifan akan mengambil keuntungan yang akan dicetuskan.

Analisis Kelebihan

Kelebihan terbesar strategi ini adalah memaksimumkan keuntungan dengan mengikuti mengambil keuntungan. Apabila harga bergerak ke arah yang menguntungkan, garis mengambil keuntungan terus bergerak ke arah yang menguntungkan untuk mengunci keuntungan.

Ia juga menambah penapisan trend dengan persilangan MA untuk mengelakkan whipsaws yang tidak perlu di pasaran bukan trend.

Dengan menggabungkan trend, masuk, mengambil keuntungan, ia boleh menunggang trend untuk mendapatkan keuntungan secara berterusan dan memaksimumkan pulangan.

Analisis Risiko

Risiko utama adalah bahawa ia memerlukan pergerakan harga yang mencukupi untuk mencapai mengambil keuntungan.

Juga, mengambil keuntungan yang kerap dalam pasaran yang bergolak boleh menyebabkan kerugian.

Dan parameter yang tidak betul seperti peratusan keuntungan yang terlalu tinggi boleh meningkatkan risiko.

Risiko boleh dikendalikan dengan menetapkan peratusan keuntungan yang betul, mengelakkan perdagangan di pasaran yang bergelora, atau menggunakan stop loss.

Pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Mengoptimumkan parameter MA dengan menguji tempoh yang berbeza untuk mencari kombinasi yang lebih baik.

  2. Mengoptimumkan ciri pengaktifan dengan menguji tahap pengaktifan yang berbeza.

  3. Mengoptimumkan mengambil peratusan keuntungan melalui backtesting.

  4. Tambah stop loss pada tahap yang sesuai untuk mengawal risiko.

  5. Uji penapis tambahan seperti kelantangan, hentian ATR dll.

  6. Ujian di pasaran yang berbeza seperti saham, forex, crypto.

Kesimpulan

Strategi ini mengintegrasikan pelbagai modul seperti trend, entry, trailing take profit untuk memaksimumkan keuntungan dengan menunggang trend. Tetapi risiko mesti diuruskan, mengelakkan pasaran bergolak, mengoptimumkan parameter sebelum digunakan. Ia memberikan idea untuk memperoleh keuntungan yang lebih besar melalui trailing take profit.


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

Lebih lanjut