감정에 기반한 XBT 선물 거래 전략

저자:차오장, 날짜: 2023-12-22 14:48:44
태그:

img

전반적인 설명

이 전략은 XBTUSD 선물 계약을 길게 또는 짧게하기 위해 다주기 정서 분석의 접근 방식을 채택합니다. 그것은 다양한 주기에 걸쳐 가격 변동 범위와 최고 및 최저 가격을 포괄적으로 고려하고 일련의 무게 조정으로 전체 시장 정서를 계산합니다. 구매 및 판매 신호는 정서 가치의 변화 패턴에 따라 생성됩니다.

전략 논리

  1. 가장 높은 가격, 가장 낮은 가격, 평균 가격, 가격 변동 범위 및 a에서 j (1-89 바) 사이클에 다른 지표를 계산합니다.

  2. 가격 범위 (플레이스 변수) 안의 폐쇄 가격의 표준화 된 위치를 정의하십시오. 각 주기의 가격 변동 범위와 결합하여 다른 주기에 대한 감정 값을 얻습니다.

  3. 감정 가치는 전체 감정 가치 (정서) 를 얻기 위해 일련의 무게 (w 변수) 조정을 거칩니다. 감정은 현재 전체 시장 분위기를 반영합니다.

  4. 감정 가치의 변동을 분석한다. 감정이 긍정적에서 부정적인로 변할 때 판매 신호가 생성된다. 감정이 부정적인에서 긍정적으로 변할 때 구매 신호가 생성된다.

  5. 입시 동력을 결정하고 감정 변동의 절대값 (델타 변수) 에 기초하여 수익을 취하고 손실을 멈추는 조건을 설정합니다.

장점

  1. 더 포괄적인 시장 트렌드 판단을 위해 다른 주기에 걸쳐 정서를 고려하십시오.

  2. 무게 조정 메커니즘은 전략을 더 안정적으로 만듭니다.

  3. 정서적 가치와 변동을 결합하여 보다 정확한 입시 시기를 설정합니다.

  4. 가장 높은 가격, 가장 낮은 가격으로 위험을 관리하고, 수익을 취하고, 손해를 막습니다.

위험성

  1. 부적절한 매개 변수 설정은 너무 빈번한 거래 또는 놓친 기회를 유발할 수 있습니다.

  2. 블랙 스완 사건은 전략 논리를 무효화 할 수 있습니다.

  3. 계약 조정 및 규칙 변경은 전략 성과에 영향을 줄 수 있습니다.

  4. 감정 계산은 역사적 데이터에 의존합니다. 시장 체제가 변경되면 재평가가 필요합니다.

변화하는 시장 조건에 맞게 무게, 거래 주기, 수익률 등을 조정하여 위험을 관리 할 수 있습니다. 한편으로는 포지션 사이즈와 전체 노출을 엄격하게 제어하여 자본 관리를 최적화하십시오.

최적화 방향

  1. 분석 주기를 확장하여 감정 판단에 더 풍부한 기반을 구축하십시오.

  2. 더 많은 기술적 지표를 통합 접근에 포함합니다.

  3. 머신러닝 방법을 이용해서 감정의 특징을 추출합니다.

  4. 무게를 동적으로 조정합니다.

  5. 수익을 취하고 손실을 멈추는 전략을 최적화하십시오.

결론

이 전략은 감정 분석의 거래 철학을 기반으로 합니다. 여러 주기를 고려하여 현재 전체 시장 분위기를 결정합니다. 지속적인 감정 변화는 시점 입시에 대한 가격 변동에 의해 지원되는 거래 신호를 생성하는 기초로 작용합니다. 시장 트렌드를 판단하는 이러한 독특한 접근 방식은 다양한 주기에 잘 작동합니다. 분석 기간을 더 확장하고 더 많은 지표를 추가하고 최적화하면 더 복잡한 시장 환경에 적응하기 위해 감정 거래 전략을 더욱 성숙하고 안정적으로 만들 수 있습니다.


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

더 많은