Esta estratégia usa o indicador TSI como o principal sinal de negociação. Quando o indicador TSI cruza sua linha de sinal e o indicador TSI está abaixo do limite inferior ou acima do limite superior, a estratégia gerará um sinal de posição aberta. Ao mesmo tempo, a estratégia também usa indicadores como EMA e ATR para otimizar o desempenho da estratégia. A estratégia só é executada dentro de sessões de negociação específicas e define uma frequência mínima de negociação para controlar o excesso de negociação.
Esta estratégia é baseada no indicador TSI e gera sinais de negociação através do cruzamento do TSI e sua linha de sinal. Ao mesmo tempo, limita o tempo e a frequência de negociação para controlar riscos. A vantagem da estratégia é que a lógica é simples e clara, e para a perda e o lucro em tempo hábil. No entanto, a desvantagem é a falta de julgamento de tendência e gestão de posição, sensibilidade aos parâmetros TSI, e só pode capturar a reversão de mercado enquanto falta mercado de tendência. No futuro, a estratégia pode ser melhorada a partir de aspectos como julgamento de tendência e volatilidade, gestão de posição e otimização de parâmetros.
/*backtest start: 2024-05-30 00:00:00 end: 2024-06-06 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © nikgavalas //@version=5 strategy("TSI Entries", overlay=true, margin_long=100, margin_short=100) // // INPUTS // // Define the start and end hours for trading string sessionInput = input("1000-1530", "Session") // Day of the week. string daysInput = input.string("23456", tooltip = "1 = Sunday, 7 = Saturday") // Minimum number of bar's between entries requiredBarsBetweenEntries = input.int(12, "Required Bars Between Entries") // Show debug labels bool showDebugLabels = input.bool(false, "Show Debug Labels") // // FUNCTIONS // //@function Define the triple exponential moving average function tema(src, len) => tema = 3 * ta.ema(src, len) - 3 * ta.ema(ta.ema(src, len), len) + ta.ema(ta.ema(ta.ema(src, len), len), len) //@function Atr with EMA atr_ema(length) => trueRange = na(high[1])? high-low : math.max(math.max(high - low, math.abs(high - close[1])), math.abs(low - close[1])) //true range can be also calculated with ta.tr(true) ta.ema(trueRange, length) //@function Check if time is in range timeinrange() => sessionString = sessionInput + ":" + daysInput inSession = not na(time(timeframe.period, sessionString, "America/New_York")) //@function Displays text passed to `txt` when called. debugLabel(txt, color, y, style) => if (showDebugLabels) label.new(bar_index, y, text = txt, color = color, style = style, textcolor = color.black, size = size.small) // // INDICATOR CODE // long = input(title="TSI Long Length", defval=8) short = input(title="TSI Short Length", defval=8) signal = input(title="TSI Signal Length", defval=3) lowerLine = input(title="TSI Lower Line", defval=-50) upperLine = input(title="TSI Upper Line", defval=50) price = close double_smooth(src, long, short) => fist_smooth = ta.ema(src, long) ta.ema(fist_smooth, short) pc = ta.change(price) double_smoothed_pc = double_smooth(pc, long, short) double_smoothed_abs_pc = double_smooth(math.abs(pc), long, short) tsiValue = 100 * (double_smoothed_pc / double_smoothed_abs_pc) signalValue = ta.ema(tsiValue, signal) // // COMMON VARIABLES // var color trendColor = na var int lastEntryBar = na bool tradeAllowed = timeinrange() == true and (na(lastEntryBar) or bar_index - lastEntryBar > requiredBarsBetweenEntries) // // CROSSOVER // bool crossOver = ta.crossover(tsiValue, signalValue) bool crossUnder = ta.crossunder(tsiValue,signalValue) if (tradeAllowed) if (signalValue < lowerLine and crossOver == true) strategy.entry("Up", strategy.long) lastEntryBar := bar_index else if (signalValue > upperLine and crossUnder == true) strategy.entry("Down", strategy.short) lastEntryBar := bar_index // // EXITS // if (strategy.position_size > 0 and crossUnder == true) strategy.close("Up", qty_percent = 100) else if (strategy.position_size < 0 and crossOver == true) strategy.close("Down", qty_percent = 100)