Strategi Perdagangan Berjangka XBT Berdasarkan Sentimen

Penulis:ChaoZhang, Tanggal: 2023-12-22 14:48:44
Tag:

img

Gambaran umum

Strategi ini mengadopsi pendekatan analisis sentimen multi-siklus untuk pergi panjang atau pendek kontrak berjangka XBTUSD. Ini secara komprehensif mempertimbangkan rentang fluktuasi harga dan harga tertinggi dan terendah di berbagai siklus, dan menghitung sentimen pasar secara keseluruhan melalui serangkaian penyesuaian bobot.

Logika Strategi

  1. Menghitung harga tertinggi, harga terendah, harga rata-rata, kisaran fluktuasi harga dan indikator lainnya di seluruh siklus dari a sampai j (1 sampai 89 bar).

  2. Tentukan posisi standar harga penutupan dalam kisaran harga (variabel tempat). Gabungkan dengan kisaran fluktuasi harga dari setiap siklus untuk mendapatkan nilai sentimen untuk siklus yang berbeda.

  3. Nilai sentimen melalui serangkaian penyesuaian bobot (variabel w) untuk mendapatkan nilai sentimen keseluruhan (sentimen). Sentimen mencerminkan suasana pasar saat ini secara keseluruhan.

  4. Menganalisis fluktuasi nilai sentimen. Sinyal jual dihasilkan ketika sentimen berubah dari positif menjadi negatif. Sinyal beli dihasilkan ketika sentimen berubah dari negatif menjadi positif.

  5. Menentukan momentum masuk dan mengatur kondisi mengambil keuntungan dan stop loss berdasarkan nilai absolut fluktuasi sentimen (variabel delta).

Keuntungan

  1. Pertimbangkan sentimen di berbagai siklus untuk penilaian tren pasar yang lebih komprehensif.

  2. Mekanisme penyesuaian berat membuat strategi lebih stabil.

  3. Waktu masuk yang lebih tepat dengan menggabungkan nilai sentimen dan fluktuasinya.

  4. Mengelola risiko dengan harga tertinggi, harga terendah, mengambil keuntungan dan stop loss.

Risiko

  1. Pengaturan parameter yang tidak benar dapat menyebabkan perdagangan yang terlalu sering atau kehilangan peluang.

  2. Peristiwa Black Swan mungkin membatalkan logika strategi.

  3. Penyesuaian kontrak dan perubahan aturan dapat mempengaruhi kinerja strategi.

  4. Perhitungan sentimen didasarkan pada data historis. penilaian ulang diperlukan ketika rezim pasar berubah.

Risiko dapat dikelola dengan menyesuaikan bobot, siklus perdagangan, mengambil rasio keuntungan dll untuk menyesuaikan dengan perubahan kondisi pasar. Sementara itu mengoptimalkan manajemen modal dengan ketat mengendalikan ukuran posisi dan eksposur keseluruhan.

Arahan Optimasi

  1. Perluas siklus analisis untuk membangun dasar yang lebih kaya untuk penilaian sentimen.

  2. Masukkan lebih banyak indikator teknis untuk pendekatan gabungan.

  3. Ekstrak fitur sentimen dengan metode pembelajaran mesin.

  4. Sesuaikan pengaturan berat secara dinamis.

  5. Mengoptimalkan mengambil keuntungan dan strategi stop loss.

Kesimpulan

Strategi ini didasarkan pada filosofi perdagangan analisis sentimen. Hal ini menentukan mood pasar secara keseluruhan saat ini dengan mempertimbangkan beberapa siklus. Perubahan sentimen terus-menerus berfungsi sebagai dasar untuk menghasilkan sinyal perdagangan, dibantu oleh fluktuasi harga untuk entri waktu. Pendekatan unik ini menilai tren pasar bekerja dengan baik dalam siklus yang bervariasi. Lebih lanjut memperluas periode analisis, menambahkan lebih banyak indikator dan mengoptimalkan dapat membuat strategi perdagangan sentimen lebih matang dan stabil untuk beradaptasi dengan lingkungan pasar yang lebih kompleks.


/*backtest
start: 2022-12-15 00:00:00
end: 2023-12-21 00:00:00
period: 1d
basePeriod: 1h
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/
// © Jomy

//@version=4

//2h chart BITMEX:XBTUSD
//use on low leverage 1-2x only

strategy("expected range STRATEGY",overlay=false,initial_capital=1000,precision=2)
leverage=input(1,"leverage",step=.5)
tp=input(53,"take profit %",step=1)
sl=input(7,"stoploss %",step=1)
stoploss=1-(sl/100)
plot(stoploss)
level=input(.70,"level to initiate trade",step=.02)
closelevel=input(0.0,"level to close trade",step=.02)
levelshort=input(.68,"level to initiate trade",step=.02)
closelevelshort=input(0.0,"level to close trade",step=.02)

wa=input(1.158,"weight a",step=.2)
wb=input(1.119,"weight b",step=.2)
wc=input(1.153,"weight c",step=.2)
wd=input(1.272,"weight d",step=.2)
we=input(1.295,"weight e",step=.2)
wf=input(1.523,"weight f",step=.2)
wg=input(1.588,"weight g",step=.2)
wh=input(2.100,"weight h",step=.2)
wi=input(1.816,"weight i",step=.2)
wj=input(2.832,"weight j",step=.2)
a=1
b=2
c=3
d=5
e=8
f=13
g=21
h=34
i=55
j=89

n=0
n:=if volume > -1
    nz(n[1])+1



ra=highest(high,a)-lowest(low,a)
aa=sma(ohlc4,a)
ha=aa[1]+ra[1]/2
la=aa[1]-ra[1]/2

rb=highest(high,b)-lowest(low,b)
ab=sma(ohlc4,b)
hb=ab[1]+rb[1]/2
lb=ab[1]-rb[1]/2

rc=highest(high,c)-lowest(low,c)
ac=sma(ohlc4,c)
hc=ac[1]+rc[1]/2
lc=ac[1]-rc[1]/2

rd=highest(high,d)-lowest(low,d)
ad=sma(ohlc4,d)
hd=ad[1]+rd[1]/2
ld=ad[1]-rd[1]/2

re=highest(high,e)-lowest(low,e)
ae=sma(ohlc4,e)
he=ae[1]+re[1]/2
le=ae[1]-re[1]/2

rf=highest(high,f)-lowest(low,f)
af=sma(ohlc4,f)
hf=af[1]+rf[1]/2
lf=af[1]-rf[1]/2

rg=highest(high,g)-lowest(low,g)
ag=sma(ohlc4,g)
hg=ag[1]+rg[1]/2
lg=ag[1]-rg[1]/2

rh=highest(high,h)-lowest(low,h)
ah=sma(ohlc4,h)
hh=ah[1]+rh[1]/2
lh=ah[1]-rh[1]/2

ri=highest(high,i)-lowest(low,i)
ai=sma(ohlc4,i)
hi=ai[1]+ri[1]/2
li=ai[1]-ri[1]/2

rj=highest(high,j)-lowest(low,j)
aj=sma(ohlc4,j)
hj=aj[1]+rj[1]/2
lj=aj[1]-rj[1]/2

placea=((close-la)/(ha-la)-.5)*-100
placeb=((close-lb)/(hb-lb)-.5)*-100
placec=((close-lc)/(hc-lc)-.5)*-100
placed=((close-ld)/(hd-ld)-.5)*-100
placee=((close-le)/(he-le)-.5)*-100
placef=((close-lf)/(hf-lf)-.5)*-100
placeg=((close-lg)/(hg-lg)-.5)*-100
placeh=((close-lh)/(hh-lh)-.5)*-100
placei=((close-li)/(hi-li)-.5)*-100
placej=((close-lj)/(hj-lj)-.5)*-100

sentiment=((placea/j)*ra*wa+(placeb/i)*rb*wb+(placec/h)*rc*wc+(placed/g)*rd*wd+(placee/f)*re*we+(placef/e)*rf*wf+(placeg/d)*rg*wg+(placeh/c)*rh*wh+(placei/b)*ri*wi+(placej/a)*rj*wj)/(wa+wb+wc+wd+we+wf+wg+wh+wi+wj)

deltalong=0.0
deltalong:=if sentiment>0
    nz(deltalong[1])+sentiment-sentiment[1]
else
    0
deltashort=0.0   
deltashort:=if sentiment<0
    nz(deltashort[1])+((sentiment-sentiment[1])*-1)
else
    0

//plot(sentiment*-1,color=color.blue)    
//plot(deltalong,color=color.red)
//plot(deltashort,color=color.lime)

peakfindlong=highest(deltalong,j)*level


peakfindshort=highest(deltashort,j)*levelshort


contracts=(strategy.equity/close)*leverage


//reason for o is this strategy makes dumb trades before the sentiment line crosses the 0 point the first time
o=0
o:=if cross(0,sentiment) and n>j
    1
else
    nz(o[1])

long=deltashort>peakfindlong and o==1

short=deltalong>peakfindshort and o==1


longstart=0.0
longstart:=if strategy.position_size>0 and strategy.position_size[1]<=0
    close
else
    nz(longstart[1])

shortstart=0.0
shortstart:=if strategy.position_size<0 and strategy.position_size[1]>=0 
    close
else
    nz(shortstart[1])    

highsincelong = 0.0
highsincelong := if strategy.position_size>0
    max(max(highsincelong[1],high),high[1])
else
    0

lowsinceshort = 1000000.0
lowsinceshort := if strategy.position_size<0
    min(min(lowsinceshort[1],low),low[1])
else
    10000000 

closelong=strategy.position_size > 0 and ((highsincelong/longstart-1)*100) > tp
closeshort=strategy.position_size < 0 and ((shortstart/lowsinceshort-1)*100) > tp

stoptrade=0
stoptrade:= if closelong
    1
else
    nz(stoptrade[1])

stoptrade:= if short and stoptrade[1]==1
    0
else
    stoptrade 

stoptrade:= if closeshort 
    -1
else
    stoptrade 
    
stoptrade:= if long and stoptrade[1]==-1
    0
else
    stoptrade     

if(closelong)
    strategy.close("Long1")   

pnllong = ((close - strategy.position_avg_price) / strategy.position_avg_price)*100
pnlshort = ((strategy.position_avg_price-close) / strategy.position_avg_price) *100
plot (strategy.position_size > 0 ?(highsincelong/longstart-1)*100 : 0.0,color=color.lime,linewidth=2)
plot (strategy.position_size < 0 ?(shortstart/lowsinceshort-1)*100 : 0.0,color=color.red,linewidth=2)  
plot( strategy.position_size > 0 ? pnllong:0, color=strategy.position_size > 0 ?color.yellow:color.black,linewidth=2 )
plot( strategy.position_size < 0 ? pnlshort:0, color=strategy.position_size < 0 ?color.orange:color.black,linewidth=2)
longuntilshort=0
longuntilshort:=if long
    1
else
    if short
        -1
    else
        nz(longuntilshort[1]) 
bgcolor(stoptrade!=0?color.black:longuntilshort==1?color.lime:longuntilshort==-1?color.red:na,transp=70)   

if(long and stoptrade==0)
    strategy.entry("Long1",strategy.long,qty=max(1,min(contracts,1000000000)))

if(closelong)
    strategy.close("Long1")
    
strategy.exit("Long1",stop=longstart * stoploss,when = strategy.position_size>0)

if(short and stoptrade==0)    
    strategy.entry("Short1",strategy.short,max(1,min(contracts,1000000000)))

if(closeshort)
    strategy.close("Short1")

strategy.exit("Long1",stop=shortstart / stoploss,when = strategy.position_size<0)

Lebih banyak