XBT-Futures-Handelsstrategie auf Basis von Gefühlen

Schriftsteller:ChaoZhang, Datum: 2023-12-22 14:48:44
Tags:

img

Übersicht

Diese Strategie verwendet den Ansatz der Mehrzyklus-Sentiment-Analyse, um den XBTUSD-Futures-Kontrakt lang oder kurz zu gehen. Sie berücksichtigt umfassend den Preisschwankungsbereich und die höchsten und niedrigsten Preise in verschiedenen Zyklen und berechnet die Gesamtmarktsentiment durch eine Reihe von Gewichtsanpassungen. Kauf- und Verkaufssignale werden basierend auf den sich ändernden Mustern des Sentiment-Wertes generiert.

Strategie Logik

  1. Berechnung des höchsten Preises, des niedrigsten Preises, des Durchschnittspreises, des Preisschwankungsbereichs und anderer Indikatoren für Zyklen von a bis j (1 bis 89 Bar).

  2. Definieere die standardisierte Position des Schlusskurses innerhalb der Preisspanne (Platzvariable) und kombiniere sie mit dem Preisschwankungsbereich jedes Zyklus, um den Sentimentwert für verschiedene Zyklen zu erhalten.

  3. Die Stimmungswerte durchlaufen eine Reihe von Gewichtsanpassungen (W-Variable), um den allgemeinen Stimmungswert (Sentiment) zu erhalten.

  4. Analysieren Sie die Schwankungen des Stimmungswerts. Ein Verkaufssignal wird erzeugt, wenn sich die Stimmung von positiv zu negativ verändert. Ein Kaufsignal wird erzeugt, wenn sich die Stimmung von negativ zu positiv verändert.

  5. Bestimmung der Eintrittsdynamik und Festlegung der Gewinn- und Stop-Loss-Bedingungen anhand des absoluten Wertes der Stimmungsschwankung (Delta-Variable).

Vorteile

  1. Für eine umfassendere Beurteilung der Marktentwicklung sollten die Stimmungen über verschiedene Zyklen hinweg berücksichtigt werden.

  2. Der Gewichtsanpassungsmechanismus macht die Strategie stabiler.

  3. Genaueres Eintritts-Timing durch Kombination von Stimmungswert und dessen Schwankung.

  4. Risiken mit höchstem Preis, niedrigstem Preis, Gewinn und Stop-Loss verwalten.

Risiken

  1. Eine falsche Einstellung der Parameter kann zu einem zu häufigen Handel oder zu fehlenden Gelegenheiten führen.

  2. Die Ereignisse des Schwarzen Schwanen können die Strategie-Logik zunichte machen.

  3. Vertragsanpassungen und Regeländerungen können sich auf die Strategieleistung auswirken.

  4. Die Berechnung der Stimmung beruht auf historischen Daten, die bei Veränderungen des Marktes neu bewertet werden müssen.

Risiken können durch Anpassung von Gewichten, Handelszyklen, Gewinnquoten usw. an sich ändernde Marktbedingungen verwaltet werden.

Optimierungsrichtlinien

  1. Erweitern Sie die Analysezyklen, um eine reichhaltigere Grundlage für ein Gefühlsbeurteilungsverfahren zu schaffen.

  2. Mehr technische Indikatoren für einen kombinierten Ansatz einbeziehen.

  3. Extrahieren Sie Gefühlsmerkmale mit Methoden des maschinellen Lernens.

  4. Dynamische Einstellungen des Gewichts.

  5. Optimieren Sie Profit- und Stop-Loss-Strategien.

Schlussfolgerung

Diese Strategie basiert auf der Handelsphilosophie der Sentiment-Analyse. Sie bestimmt die aktuelle allgemeine Marktstimmung, indem sie mehrere Zyklen berücksichtigt. Die kontinuierlichen Sentiment-Änderungen dienen als Grundlage für die Erzeugung von Handelssignalen, unterstützt durch Preisschwankungen für den Timing-Eintrag. Dieser einzigartige Ansatz zur Beurteilung von Markttrends funktioniert gut in unterschiedlichen Zyklen. Weitere Ausweitung der Analyseperioden, Hinzufügen mehr Indikatoren und Optimierung kann die Sentiment-Handelsstrategie reif und stabiler für die Anpassung an komplexere Marktumgebungen machen.


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

Mehr