
A estratégia é um sistema de negociação completo que combina uma série de indicadores técnicos, baseando-se principalmente nos indicadores da nuvem de Ichimoku para tomar decisões comerciais. O sistema determina o momento de entrada através do cruzamento da antena Tenkan com a linha de referência Kijun, enquanto combina o índice relativamente forte RSI e a média móvel MA como condições auxiliares de filtragem. A estratégia usa o componente da nuvem como ponto de parada dinâmico, formando um sistema completo de controle de risco.
A lógica central da estratégia é baseada nos seguintes elementos-chave:
A estratégia, através da combinação de vários indicadores técnicos, constrói um sistema de negociação completo. A estratégia não se concentra apenas na geração de sinais, mas também inclui um mecanismo de controle de risco completo. A taxa de sucesso da negociação é efetivamente aumentada por meio da configuração de condições de filtragem múltiplas.
/*backtest
start: 2019-12-23 08:00:00
end: 2024-11-27 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Ichimoku Strategy with Optional RSI, MA Filters and Alerts", overlay=true)
// Input for date and time filter
startDate = input(timestamp("2020-01-01 00:00"), title="Start Date")
endDate = input(timestamp("2023-01-01 00:00"), title="End Date")
// Inputs for Ichimoku settings
tenkanPeriod = input.int(9, title="Tenkan Period")
kijunPeriod = input.int(26, title="Kijun Period")
senkouBPeriod = input.int(52, title="Senkou B Period")
// Inputs for Moving Average settings
useMAFilter = input.bool(true, title="Enable Moving Average Filter?")
ma50Period = input.int(50, title="50-day MA Period")
ma200Period = input.int(200, title="200-day MA Period")
// Inputs for RSI settings
useRSIFilter = input.bool(true, title="Enable RSI Filter?")
rsiPeriod = input.int(14, title="RSI Period")
rsiOverbought = input.int(70, title="RSI Overbought Level")
rsiOversold = input.int(30, title="RSI Oversold Level")
// Ichimoku Cloud components
tenkan = (ta.highest(high, tenkanPeriod) + ta.lowest(low, tenkanPeriod)) / 2
kijun = (ta.highest(high, kijunPeriod) + ta.lowest(low, kijunPeriod)) / 2
senkouA = ta.sma(tenkan + kijun, 2) / 2
senkouB = (ta.highest(high, senkouBPeriod) + ta.lowest(low, senkouBPeriod)) / 2
chikou = close[26]
// Moving Averages
ma50 = ta.sma(close, ma50Period)
ma200 = ta.sma(close, ma200Period)
// Weekly RSI
rsiSource = request.security(syminfo.tickerid, "W", ta.rsi(close, rsiPeriod))
// Plotting the Ichimoku Cloud components
pTenkan = plot(tenkan, color=color.blue, title="Tenkan")
pKijun = plot(kijun, color=color.red, title="Kijun")
pSenkouA = plot(senkouA, color=color.green, title="Senkou A")
pSenkouB = plot(senkouB, color=color.maroon, title="Senkou B")
plot(chikou, color=color.purple, title="Chikou")
plot(ma50, color=color.orange, title="50-day MA")
plot(ma200, color=color.yellow, title="200-day MA")
// Corrected fill function
fill(pSenkouA, pSenkouB, color=senkouA > senkouB ? color.green : color.red, transp=90)
// Debugging: Output values on the chart to see if conditions are ever met
plotshape(series=(tenkan > kijun), color=color.blue, style=shape.triangleup, title="Tenkan > Kijun")
plotshape(series=(tenkan < kijun), color=color.red, style=shape.triangledown, title="Tenkan < Kijun")
plotshape(series=(ma50 > ma200), color=color.orange, style=shape.labelup, title="MA 50 > MA 200")
plotshape(series=(ma50 < ma200), color=color.yellow, style=shape.labeldown, title="MA 50 < MA 200")
// Define the trailing stop loss using Kumo
var float trailingStopLoss = na
// Check for MA conditions (apply only if enabled)
maConditionLong = not useMAFilter or (useMAFilter and ma50 > ma200)
maConditionShort = not useMAFilter or (useMAFilter and ma50 < ma200)
// Check for Ichimoku Cloud conditions
ichimokuLongCondition = close > math.max(senkouA, senkouB)
ichimokuShortCondition = close < math.min(senkouA, senkouB)
// Check for RSI conditions (apply only if enabled)
rsiConditionLong = not useRSIFilter or (useRSIFilter and rsiSource > rsiOverbought)
rsiConditionShort = not useRSIFilter or (useRSIFilter and rsiSource < rsiOversold)
// Combine conditions for entry
longCondition = maConditionLong and tenkan > kijun and ichimokuLongCondition and rsiConditionLong
shortCondition = maConditionShort and tenkan < kijun and ichimokuShortCondition and rsiConditionShort
// Date and time filter
withinDateRange = true
// Check for Long Condition
if (longCondition and withinDateRange)
strategy.entry("Long", strategy.long)
trailingStopLoss := math.min(senkouA, senkouB)
alert("Buy Signal: Entering Long Position", alert.freq_once_per_bar_close)
// Check for Short Condition
if (shortCondition and withinDateRange)
strategy.entry("Short", strategy.short)
trailingStopLoss := math.max(senkouA, senkouB)
alert("Sell Signal: Entering Short Position", alert.freq_once_per_bar_close)
// Exit conditions
exitLongCondition = close < kijun or tenkan < kijun
exitShortCondition = close > kijun or tenkan > kijun
if (exitLongCondition and strategy.position_size > 0)
strategy.close("Long")
alert("Exit Signal: Closing Long Position", alert.freq_once_per_bar_close)
if (exitShortCondition and strategy.position_size < 0)
strategy.close("Short")
alert("Exit Signal: Closing Short Position", alert.freq_once_per_bar_close)
// Apply trailing stop loss
if (strategy.position_size > 0)
strategy.exit("Trailing Stop Long", stop=trailingStopLoss)
else if (strategy.position_size < 0)
strategy.exit("Trailing Stop Short", stop=trailingStopLoss)