Chiến lược giao dịch tương lai XBT dựa trên tình cảm

Tác giả:ChaoZhang, Ngày: 2023-12-22 14:48:44
Tags:

img

Tổng quan

Chiến lược này áp dụng phương pháp phân tích tâm lý đa chu kỳ để đi dài hoặc ngắn hợp đồng tương lai XBTUSD. Nó xem xét toàn diện phạm vi biến động giá và giá cao nhất và thấp nhất trong các chu kỳ khác nhau, và tính toán tâm lý thị trường tổng thể thông qua một loạt các điều chỉnh trọng lượng. Các tín hiệu mua và bán được tạo ra dựa trên các mô hình thay đổi giá trị tâm lý.

Chiến lược logic

  1. Tính toán giá cao nhất, giá thấp nhất, giá trung bình, phạm vi biến động giá và các chỉ số khác trên các chu kỳ từ a đến j (1 đến 89 thanh).

  2. Định nghĩa vị trí tiêu chuẩn của giá đóng cửa trong phạm vi giá (biến biến vị trí). Kết hợp nó với phạm vi biến động giá của mỗi chu kỳ để có được giá trị tâm lý cho các chu kỳ khác nhau.

  3. Các giá trị tâm lý trải qua một loạt các điều chỉnh trọng lượng (biến biến w) để có được giá trị tâm lý tổng thể (tâm lý).

  4. Phân tích sự biến động của giá trị tâm lý. Một tín hiệu bán được tạo ra khi tâm lý chuyển từ tích cực sang tiêu cực. Một tín hiệu mua được tạo ra khi tâm lý chuyển từ tiêu cực sang tích cực.

  5. Xác định động lượng đầu vào và đặt các điều kiện lấy lợi nhuận và dừng lỗ dựa trên giá trị tuyệt đối của biến động tâm lý (biến động delta).

Ưu điểm

  1. Xem xét tâm lý trong các chu kỳ khác nhau để đánh giá xu hướng thị trường toàn diện hơn.

  2. Cơ chế điều chỉnh trọng lượng làm cho chiến lược ổn định hơn.

  3. Thời gian nhập cảnh chính xác hơn bằng cách kết hợp giá trị cảm xúc và biến động của nó.

  4. Quản lý rủi ro với giá cao nhất, giá thấp nhất, lấy lợi nhuận và dừng lỗ.

Rủi ro

  1. Cài đặt tham số không chính xác có thể gây ra giao dịch quá thường xuyên hoặc bỏ lỡ cơ hội.

  2. Các sự kiện thiên nga đen có thể làm vô hiệu hóa chiến lược logic.

  3. Điều chỉnh hợp đồng và thay đổi quy tắc có thể ảnh hưởng đến hiệu suất chiến lược.

  4. Tính toán tinh thần dựa trên dữ liệu lịch sử. Đánh giá lại là cần thiết khi chế độ thị trường thay đổi.

Rủi ro có thể được quản lý bằng cách điều chỉnh cân nặng, chu kỳ giao dịch, tỷ lệ lợi nhuận vv để phù hợp với điều kiện thị trường thay đổi.

Hướng dẫn tối ưu hóa

  1. Mở rộng các chu kỳ phân tích để xây dựng cơ sở phong phú hơn cho phán đoán tình cảm.

  2. Bao gồm nhiều chỉ số kỹ thuật hơn cho một cách tiếp cận kết hợp.

  3. Xóa các tính năng cảm xúc bằng các phương pháp học máy.

  4. Điều chỉnh động các thiết lập trọng lượng.

  5. Tối ưu hóa chiến lược lấy lợi nhuận và dừng lỗ.

Kết luận

Chiến lược này dựa trên triết lý giao dịch của phân tích tâm lý. Nó xác định tâm trạng thị trường tổng thể hiện tại bằng cách xem xét nhiều chu kỳ. Những thay đổi tâm lý liên tục phục vụ như là cơ sở để tạo ra các tín hiệu giao dịch, được hỗ trợ bởi biến động giá cho thời gian nhập cảnh. Cách tiếp cận độc đáo này để đánh giá xu hướng thị trường hoạt động tốt trong các chu kỳ khác nhau.


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

Thêm nữa