Esta estratégia adota a abordagem de análise de sentimento multi-ciclo para longo ou curto contrato de futuros XBTUSD. Ele considera abrangentemente a faixa de flutuação de preços e os preços mais altos e mais baixos em diferentes ciclos, e calcula o sentimento geral do mercado através de uma série de ajustes de peso.
Calcular o preço mais alto, o preço mais baixo, o preço médio, a faixa de flutuação dos preços e outros indicadores para os ciclos de a a j (1 a 89 bares).
Defina a posição padronizada do preço de fechamento dentro da faixa de preços (variavel de lugar). Combine-a com a faixa de flutuação de preços de cada ciclo para obter o valor do sentimento para diferentes ciclos.
Os valores do sentimento passam por uma série de ajustes de peso (variavel w) para obter o valor geral do sentimento (sentimento).
Analise a flutuação do valor do sentimento. Um sinal de venda é gerado quando o sentimento muda de positivo para negativo. Um sinal de compra é gerado quando o sentimento muda de negativo para positivo.
Determinar a dinâmica de entrada e definir as condições de captação de lucro e stop loss com base no valor absoluto da flutuação do sentimento (variavel delta).
Considere o sentimento em diferentes ciclos para um julgamento mais abrangente da tendência do mercado.
O mecanismo de ajustamento do peso torna a estratégia mais estável.
Tempo de entrada mais preciso combinando o valor do sentimento e sua flutuação.
Gerencie os riscos com o preço mais alto, o preço mais baixo, tire lucro e pare de perder.
A configuração inadequada dos parâmetros pode causar negociações demasiado frequentes ou oportunidades perdidas.
Os eventos do cisne negro podem invalidar a lógica da estratégia.
Os ajustamentos dos contratos e as alterações das regras podem afectar o desempenho da estratégia.
O cálculo do sentimento baseia-se em dados históricos, sendo necessária uma reavaliação quando o regime do mercado muda.
Os riscos podem ser gerenciados ajustando pesos, ciclos de negociação, rácios de lucro, etc. para se adequar às condições de mercado em mudança.
Ampliar os ciclos de análise para construir uma base mais rica para o julgamento do sentimento.
Incorporar mais indicadores técnicos para uma abordagem combinada.
Extrair características de sentimento com métodos de aprendizagem de máquina.
Ajuste dinâmico das configurações de peso.
Otimizar estratégias de lucro e stop loss.
Esta estratégia é baseada na filosofia de negociação da análise de sentimentos. Determina o humor geral do mercado atual considerando vários ciclos. As mudanças contínuas de sentimento servem como base para gerar sinais de negociação, auxiliadas pela flutuação de preços para a entrada de tempo. Esta abordagem única de julgar as tendências do mercado funciona bem em ciclos variados. A expansão adicional dos períodos de análise, a adição de mais indicadores e a otimização podem tornar a estratégia de negociação de sentimentos mais madura e estável para adaptar-se a ambientes de mercado mais complexos.
/*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)