A estratégia de negociação de inversão de média móvel dupla gera sinais de negociação calculando médias móveis simples de dois períodos diferentes - curto prazo e longo prazo.
Esta estratégia define duas médias móveis simples com diferentes comprimentos de período através dos parâmetros de entrada, com o MA de curto período referido como a linha rápida e o MA de longo período referido como a linha lenta. A linha rápida reage mais rapidamente às mudanças de preço e capta tendências de curto prazo, enquanto a linha lenta reage mais lentamente às mudanças de preço e filtra o ruído do mercado de curto prazo, capturando a tendência principal. Quando a linha rápida cruza acima da linha lenta, indica que a tendência de alta está se fortalecendo e uma posição longa é tomada. Quando a linha rápida cruza abaixo da linha lenta, indica que a tendência de queda está se fortalecendo e uma posição curta é tomada.
Especificamente, a estratégia calcula os dois MAs usando a função sma(), atribuindo o resultado para xSMA (linha lenta) e linha rápida. Os MAs são calculados com base no preço de fechamento. Quando o preço de fechamento cruza acima de xSMA, uma posição longa é tomada. Quando o preço de fechamento cruza abaixo de xSMA, uma posição curta é tomada. A estratégia também define um limite de intervalo de tempo de negociação, de modo que os sinais de negociação são gerados apenas dentro do intervalo de tempo especificado.
Os pontos de take profit e stop loss são definidos para cada negociação, e o lucro é tomado ou a stop loss é acionada imediatamente quando o preço atinge o nível de take profit ou stop loss.
O risco pode ser reduzido ajustando os parâmetros MA, otimizando a estratégia take profit/stop loss, removendo limitações de tempo ou definindo períodos de tempo de negociação mais razoáveis.
A estratégia de reversão de média móvel dupla é uma estratégia simples e prática de seguir tendências. Ela aproveita ao máximo o efeito suavizador dos MA para identificar a direção da tendência e usa MA rápidos / lentos para gerar sinais de negociação. A estratégia é fácil de implementar com lógica clara, adequada para os iniciantes entenderem. No entanto, pode gerar sinais falsos excessivos e problemas de atraso. Melhorias podem ser feitas por meio de otimização de parâmetros, adição de indicadores auxiliares, etc. para tornar a estratégia mais robusta. Se usada corretamente, esta estratégia pode gerar lucros constantes e vale a pena testes e otimização abrangentes.
/*backtest start: 2023-09-15 00:00:00 end: 2023-10-15 00:00:00 period: 4h basePeriod: 15m 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/ // © HPotter // Simple SMA strategy // // WARNING: // - For purpose educate only // - This script to change bars colors //@version=4 timeinrange(res, sess) => not na(time(res, sess)) ? 1 : 0 strategy(title="Simple SMA Strategy Backtest", shorttitle="SMA Backtest", precision=6, overlay=true) Resolution = input(title="Resolution", type=input.resolution, defval="D") Source = input(title="Source", type=input.source, defval=close) xSeries = security(syminfo.tickerid, Resolution, Source) Length = input(title="Length", type=input.integer, defval=14, minval=2) TriggerPrice = input(title="Trigger Price", type=input.source, defval=close) TakeProfit = input(50, title="Take Profit", step=0.01) StopLoss = input(20, title="Stop Loss", step=0.01) UseTPSL = input(title="Use Take\Stop", type=input.bool, defval=false) BarColors = input(title="Painting bars", type=input.bool, defval=true) ShowLine = input(title="Show Line", type=input.bool, defval=true) UseAlerts = input(title="Use Alerts", type=input.bool, defval=false) timeframe = input(title="Time Frame", defval="15") timerange = input(title="Time Range", defval="2300-0800") reverse = input(title="Trade Reverse", type=input.bool, defval=false) pos = 0 xSMA = sma(xSeries, Length) pos := iff(TriggerPrice > xSMA, 1, iff(TriggerPrice < xSMA, -1, nz(pos[1], 0))) nRes = ShowLine ? xSMA : na alertcondition(UseAlerts == true and pos != pos[1] and pos == 1, title='Signal Buy', message='Strategy to change to BUY') alertcondition(UseAlerts == true and pos != pos[1] and pos == -1, title='Signal Sell', message='Strategy to change to SELL') alertcondition(UseAlerts == true and pos != pos[1] and pos == 0, title='FLAT', message='Strategy get out from position') possig =iff(pos[1] != pos, iff(reverse and pos == 1, -1, iff(reverse and pos == -1, 1, pos)), 0) if (possig == 1 and timeinrange(timeframe, timerange)) strategy.entry("Long", strategy.long) if (possig == -1 and timeinrange(timeframe, timerange)) strategy.entry("Short", strategy.short) if (timeinrange(timeframe, timerange) == 0) strategy.close_all() if (UseTPSL) strategy.close("Long", when = high > strategy.position_avg_price + TakeProfit, comment = "close buy take profit") strategy.close("Long", when = low < strategy.position_avg_price - StopLoss, comment = "close buy stop loss") strategy.close("Short", when = low < strategy.position_avg_price - TakeProfit, comment = "close buy take profit") strategy.close("Short", when = high > strategy.position_avg_price + StopLoss, comment = "close buy stop loss") nColor = BarColors ? strategy.position_avg_price != 0 and pos == 1 ? color.green :strategy.position_avg_price != 0 and pos == -1 ? color.red : color.blue : na barcolor(nColor) plot(nRes, title='SMA', color=#00ffaa, linewidth=2, style=plot.style_line)