Strategi Pengesanan Trend Harga Momentum

Penulis:ChaoZhang, Tarikh: 2023-11-13 16:44:58
Tag:

img

Ringkasan

Strategi penjejakan trend harga momentum menggunakan beberapa penunjuk momentum untuk mengenal pasti trend harga, menubuhkan kedudukan pada permulaan trend, dan mengunci keuntungan melalui tetapan berhenti keuntungan dan berhenti kerugian untuk mengesan trend harga.

Logika Strategi

Strategi pengesanan trend harga momentum terutamanya menggunakan penunjuk teknikal berikut:

  1. Indikator ROC: Indikator ini mengira kadar peratusan perubahan harga dalam tempoh tertentu untuk menentukan momentum harga. Apabila ROC positif, ia bermakna harga meningkat. Apabila ROC negatif, ia bermakna harga jatuh. Strategi menggunakan penunjuk ROC untuk menentukan arah trend harga.

  2. Indikator Kuasa Lembu dan Kuasa Beruang: Indikator ini mencerminkan perbandingan kuasa antara lembu dan lembu. Kuasa Lembu > 0 menunjukkan kuasa lembu lebih besar daripada kuasa beruang dan harga naik. Strategi menggunakan indikator ini untuk meramalkan arah harga dengan membandingkan kekuatan lembu dan beruang.

  3. Perbezaan: Penunjuk ini mengenal pasti pembalikan trend dengan mengira perbezaan harga dan jumlah.

  4. Saluran Donchian: Indikator ini membina saluran menggunakan harga tertinggi dan terendah, dan sempadan saluran boleh berfungsi sebagai sokongan dan rintangan.

  5. Purata Bergerak: Penunjuk ini menyelaraskan turun naik harga untuk mengenal pasti arah trend keseluruhan. Strategi menggunakannya untuk menentukan trend harga umum.

Strategi menentukan trend harga dan titik pembalikan berdasarkan penunjuk di atas, dan menubuhkan kedudukan panjang atau pendek mengikut isyarat penunjuk pada permulaan trend.

Analisis Kelebihan

Kelebihan strategi ini termasuk:

  1. Menggunakan pelbagai penunjuk untuk menentukan trend mengurangkan kemungkinan penilaian yang salah.

  2. Menggunakan perbezaan penunjuk membolehkan menangkap dengan tepat titik pembalikan trend.

  3. Menggabungkan saluran dan purata bergerak membantu menentukan trend keseluruhan.

  4. Menetapkan stop profit dan stop loss memastikan keuntungan tepat pada masanya dan mengelakkan pengeluaran yang diperluaskan.

  5. Parameter yang boleh diselaraskan menjadikan strategi dapat disesuaikan dengan tempoh dan produk yang berbeza.

  6. Logik yang jelas memudahkan pengoptimuman lanjut.

Analisis Risiko

Risiko berpotensi strategi ini termasuk:

  1. Beberapa penunjuk boleh meningkatkan kebarangkalian isyarat yang salah.

  2. Titik stop loss yang ditetapkan terlalu kecil boleh meningkatkan kebarangkalian stop loss, manakala terlalu luas boleh memperluaskan drawdown.

  3. Penggunaan buta dalam tempoh pasaran yang berbeza boleh menyebabkan ketidakupayaan.

  4. Modal yang mencukupi untuk menyokong unit kedudukan tinggi diperlukan untuk mencapai pulangan yang berlebihan.

  5. Risiko overfiting backtest wujud.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Mengoptimumkan parameter penunjuk untuk mencari kombinasi optimum untuk tempoh dan produk yang berbeza.

  2. Memperkenalkan algoritma pembelajaran mesin untuk mencari parameter optimum secara automatik.

  3. Membina mekanisme berhenti rugi adaptif berdasarkan keadaan pasaran.

  4. Sertakan faktor frekuensi tinggi dan asas untuk meningkatkan alfa.

  5. Membangunkan rangka kerja ujian automatik untuk pengoptimuman parameter dan pengesahan prestasi.

  6. Memperkenalkan modul pengurusan risiko untuk mengawal saiz kedudukan dan mengurangkan pengeluaran.

  7. Tambah perdagangan dan ujian simulasi dan langsung untuk meningkatkan kestabilan.

Kesimpulan

Strategi ini menggabungkan beberapa penunjuk momentum untuk menentukan trend harga dan menggunakan stop profit / loss untuk mengunci keuntungan. Ia boleh menangkap trend dengan berkesan dengan kestabilan yang kuat. Penambahbaikan lanjut dalam penyesuaian parameter, pengoptimuman struktur dan kawalan risiko akan meningkatkan prestasi dan pengurusan risiko. Strategi ini menyediakan penyelesaian trend yang boleh dipercayai dan mudah digunakan untuk perdagangan kuantitatif.


/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-09 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © mbagheri746

//@version=4
strategy("Bagheri IG Ether v2", overlay=true, margin_long=100, margin_short=100)

TP = input(3000, minval = 1 , title ="Take Profit")
SL = input(2200, minval = 1 , title ="Stop Loss")


//_________________ RoC Definition _________________


rocLength = input(title="ROC Length", type=input.integer, minval=1, defval=186)
smoothingLength = input(title="Smoothing Length", type=input.integer, minval=1, defval=50)
src = input(title="Source", type=input.source, defval=close)

ma = ema(src, smoothingLength)
mom = change(ma, rocLength)

sroc = nz(ma[rocLength]) == 0
     ? 100
     : mom == 0
         ? 0
         : 100 * mom / ma[rocLength]

//srocColor = sroc >= 0 ? #0ebb23 : color.red
//plot(sroc, title="SROC", linewidth=2, color=srocColor, transp=0)
//hline(0, title="Zero Level", linestyle=hline.style_dotted, color=#989898)


//_________________ Donchian Channel _________________

length1 = input(53, minval=1, title="Upper Channel")
length2 = input(53, minval=1, title="Lower Channel")
offset_bar = input(91,minval=0, title ="Offset Bars")

upper = highest(length1)
lower = lowest(length2)

basis = avg(upper, lower)


DC_UP_Band = upper[offset_bar]
DC_LW_Band = lower[offset_bar]

l = plot(DC_LW_Band, style=plot.style_line, linewidth=1, color=color.red)
u = plot(DC_UP_Band, style=plot.style_line, linewidth=1, color=color.aqua)

fill(l,u,color = color.new(color.aqua,transp = 90))

//_________________ Bears Power _________________


wmaBP_period = input(65,minval=1,title="BearsP WMA Period")
line_wma = ema(close, wmaBP_period)

BP = low - line_wma


//_________________ Balance of Power _________________

ES_BoP=input(15, title="BoP Exponential Smoothing")
BOP=(close - open) / (high - low)

SBOP = rma(BOP, ES_BoP)

//_________________ Alligator _________________

//_________________ CCI _________________

//_________________ Moving Average _________________

sma_period = input(74, minval = 1 , title = "SMA Period")
sma_shift = input(37, minval = 1 , title = "SMA Shift")

sma_primary = sma(close,sma_period)

SMA_sh = sma_primary[sma_shift]

plot(SMA_sh, style=plot.style_line, linewidth=2, color=color.yellow)

//_________________ Long Entry Conditions _________________//

MA_Lcnd = SMA_sh > low and SMA_sh < high

ROC_Lcnd = sroc < 0

DC_Lcnd = open < DC_LW_Band

BP_Lcnd = BP[1] < BP[0] and BP[1] < BP[2]

BOP_Lcnd = SBOP[1] < SBOP[0]

//_________________ Short Entry Conditions _________________//

MA_Scnd = SMA_sh > low and SMA_sh < high

ROC_Scnd = sroc > 0

DC_Scnd = open > DC_UP_Band

BP_Scnd = BP[1] > BP[0] and BP[1] > BP[2]

BOP_Scnd = SBOP[1] > SBOP[0]

//_________________ OPEN POSITION __________________//

if strategy.position_size  == 0
    strategy.entry(id = "BUY", long = true , when = MA_Lcnd and ROC_Lcnd and DC_Lcnd and BP_Lcnd and BOP_Lcnd)
    strategy.entry(id = "SELL", long = false , when = MA_Scnd and ROC_Scnd and DC_Scnd and BP_Scnd and BOP_Scnd)

//_________________ CLOSE POSITION __________________//

strategy.exit(id = "CLOSE BUY", from_entry = "BUY", profit = TP , loss = SL)

strategy.exit(id = "CLOSE SELL", from_entry = "SELL" , profit = TP , loss = SL)

//_________________ TP and SL Plot __________________//

currentPL= strategy.openprofit
pos_price = strategy.position_avg_price
open_pos = strategy.position_size

TP_line = (strategy.position_size  > 0) ? (pos_price + TP/100) : strategy.position_size < 0 ? (pos_price - TP/100) : 0.0
SL_line = (strategy.position_size  > 0) ? (pos_price - SL/100) : strategy.position_size < 0 ? (pos_price + SL/100) : 0.0

// hline(TP_line, title = "Take Profit", color = color.green , linestyle = hline.style_dotted, editable = false)
// hline(SL_line, title = "Stop Loss", color = color.red , linestyle = hline.style_dotted, editable = false)


Tline = plot(TP_line != 0.0 ? TP_line : na , title="Take Profit", color=color.green, trackprice = true, show_last = 1)
Sline = plot(SL_line != 0.0 ? SL_line : na, title="Stop Loss", color=color.red, trackprice = true, show_last = 1)
Pline = plot(pos_price != 0.0 ? pos_price : na, title="Stop Loss", color=color.gray, trackprice = true, show_last = 1)


fill(Tline , Pline, color = color.new(color.green,transp = 90))
fill(Sline , Pline, color = color.new(color.red,transp = 90))

//_________________ Alert __________________//

//alertcondition(condition = , title = "Position Alerts", message = "Bagheri IG Ether\n Symbol: {{ticker}}\n Type: {{strategy.order.id}}")

//_________________ Label __________________//


inMyPrice           = input(title="My Price", type=input.float, defval=0)
inLabelStyle        = input(title="Label Style", options=["Upper Right", "Lower Right"], defval="Lower Right")

posColor = color.new(color.green, 25)
negColor = color.new(color.red, 25)
dftColor = color.new(color.aqua, 25)
posPnL   = (strategy.position_size != 0) ? (close * 100 / strategy.position_avg_price - 100) : 0.0
posDir   = (strategy.position_size  > 0) ? "long" : strategy.position_size < 0 ? "short" : "flat"
posCol   = (strategy.openprofit > 0) ? posColor : (strategy.openprofit < 0) ? negColor : dftColor
myPnL    = (inMyPrice != 0) ? (close * 100 / inMyPrice - 100) : 0.0

var label lb = na
label.delete(lb)
lb := label.new(bar_index, close,
   color=posCol,
   style=inLabelStyle=="Lower Right"?label.style_label_upper_left:label.style_label_lower_left,
   text=
      "╔═══════╗" +"\n" + 
      "Pos: "  +posDir +"\n" +
      "Pos Price: "+tostring(strategy.position_avg_price) +"\n" +
      "Pos PnL: "  +tostring(posPnL, "0.00") + "%" +"\n" +
      "Profit: "  +tostring(strategy.openprofit, "0.00") + "$" +"\n" +
      "TP: "  +tostring(TP_line, "0.00") +"\n" +
      "SL: "  +tostring(SL_line, "0.00") +"\n" +
      "╚═══════╝")






Lebih lanjut