Cette stratégie adopte l'approche de l'analyse du sentiment multi-cycle pour aller long ou court sur le contrat à terme XBTUSD. Elle considère de manière exhaustive la fourchette de fluctuation des prix et les prix les plus élevés et les plus bas à travers différents cycles, et calcule le sentiment global du marché à travers une série d'ajustements de poids. Les signaux d'achat et de vente sont générés en fonction des modèles changeants de la valeur du sentiment.
Calculer le prix le plus élevé, le prix le plus bas, le prix moyen, la fourchette de fluctuation des prix et d'autres indicateurs pour les cycles de a à j (1 à 89 bar).
Définissez la position standardisée du prix de clôture dans la fourchette de prix (variable de place). Combinez-la avec la fourchette de fluctuation des prix de chaque cycle pour obtenir la valeur du sentiment pour différents cycles.
Les valeurs du sentiment subissent une série d'ajustements de poids (variable w) pour obtenir la valeur globale du sentiment (sentiment).
Analysez la fluctuation de la valeur du sentiment. Un signal de vente est généré lorsque le sentiment passe de positif à négatif. Un signal d'achat est généré lorsque le sentiment passe de négatif à positif.
Déterminer la dynamique d'entrée et définir les conditions de prise de profit et de stop-loss en fonction de la valeur absolue de la fluctuation du sentiment (variable delta).
Considérez le sentiment à travers différents cycles pour un jugement plus complet de la tendance du marché.
Le mécanisme d'ajustement du poids rend la stratégie plus stable.
Un calendrier d'entrée plus précis en combinant la valeur du sentiment et sa fluctuation.
Gérez les risques avec le prix le plus élevé, le prix le plus bas, profitez et arrêtez la perte.
Des paramètres mal réglés peuvent entraîner des transactions trop fréquentes ou des opportunités manquées.
Les événements du cygne noir peuvent invalider la logique de la stratégie.
Les ajustements contractuels et les changements de règles peuvent avoir une incidence sur la performance de la stratégie.
Le calcul du sentiment s'appuie sur des données historiques, qui doivent être réévaluées lorsque le régime du marché change.
Les risques peuvent être gérés en ajustant les pondérations, les cycles de négociation, les ratios de profit, etc. pour s'adapter aux conditions changeantes du marché.
Élargir les cycles d'analyse pour construire une base plus riche pour le jugement du sentiment.
Incorporer davantage d'indicateurs techniques pour une approche combinée.
Extraire les caractéristiques du sentiment avec des méthodes d'apprentissage automatique.
Ajustez dynamiquement les réglages de poids.
Optimiser les stratégies de prise de profit et de stop-loss.
Cette stratégie est basée sur la philosophie de trading de l'analyse du sentiment. Elle détermine l'humeur globale du marché actuel en considérant plusieurs cycles. Les changements de sentiment continus servent de base pour générer des signaux de trading, aidés par la fluctuation des prix pour l'entrée en temps. Cette approche unique de juger les tendances du marché fonctionne bien dans des cycles variés.
/*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)