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.
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).
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.
Die Stimmungswerte durchlaufen eine Reihe von Gewichtsanpassungen (W-Variable), um den allgemeinen Stimmungswert (Sentiment) zu erhalten.
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.
Bestimmung der Eintrittsdynamik und Festlegung der Gewinn- und Stop-Loss-Bedingungen anhand des absoluten Wertes der Stimmungsschwankung (Delta-Variable).
Für eine umfassendere Beurteilung der Marktentwicklung sollten die Stimmungen über verschiedene Zyklen hinweg berücksichtigt werden.
Der Gewichtsanpassungsmechanismus macht die Strategie stabiler.
Genaueres Eintritts-Timing durch Kombination von Stimmungswert und dessen Schwankung.
Risiken mit höchstem Preis, niedrigstem Preis, Gewinn und Stop-Loss verwalten.
Eine falsche Einstellung der Parameter kann zu einem zu häufigen Handel oder zu fehlenden Gelegenheiten führen.
Die Ereignisse des Schwarzen Schwanen können die Strategie-Logik zunichte machen.
Vertragsanpassungen und Regeländerungen können sich auf die Strategieleistung auswirken.
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.
Erweitern Sie die Analysezyklen, um eine reichhaltigere Grundlage für ein Gefühlsbeurteilungsverfahren zu schaffen.
Mehr technische Indikatoren für einen kombinierten Ansatz einbeziehen.
Extrahieren Sie Gefühlsmerkmale mit Methoden des maschinellen Lernens.
Dynamische Einstellungen des Gewichts.
Optimieren Sie Profit- und Stop-Loss-Strategien.
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)