
A estratégia de cruzamento de indicadores de força relativamente fracos de quadros múltiplos é um sistema de negociação baseado no Stochastic RSI (indicador de força relativamente fraco aleatório), que usa dados de dois períodos de tempo de 5 minutos e 15 minutos para a geração e confirmação de sinais de negociação. É um sistema de negociação completo, com condições de entrada definidas, controle de stop loss e esquemas de lucro em etapas.
A estratégia opera em gráficos de 5 minutos, mas refere-se a dados de gráficos de 15 minutos para confirmar os sinais de negociação, refletindo a profundidade da análise de múltiplos prazos de tempo. Ele usa diferentes configurações de parâmetros para negociações de multi-cabeças e de cabeças vazias, o que sugere que ele foi projetado para se adaptar a um mercado otimista como um todo.
O princípio central da estratégia é baseado no sinal de cruzamento do indicador Stochastic RSI, combinado com o mecanismo de confirmação de múltiplos quadros de tempo para filtrar sinais de baixa qualidade. O processo de trabalho específico é o seguinte:
Trigger inicial (quadro de tempo de 5 minutos):
Confirmação de nível superior (quadro de tempo de 15 minutos):
Filtragem de sinais repetidos:
Gestão de posições:
Mecanismo de lucro em duas etapas:
Mecanismo de confirmação de multi-quadros temporais:
Determinação exata das condições de sobrecompra/sobrevenda:
Estratégia de suspensão por etapas:
Definições de preferências personalizadas:
Gerenciamento de riscos completo:
Filtragem de sinais repetidos:
Sensibilidade do parâmetro:
O ponto de parada pode ser mais amplo:
Dependência de condições de mercado:
Preconceitos sobre a polygamia:
15 minutos de atraso confirmado:
Mecanismo de travagem dinâmica:
O estado do mercado adapta-se:
Confirmação de múltiplos indicadores:
Optimização de aberturas de risco:
Extensão a níveis de quadros temporais múltiplos:
Filtro de tempo de transação:
A estratégia de cruzamento de indicadores de força relativamente forte em quadros de tempo múltiplos é um sistema de negociação bem estruturado que aumenta a qualidade de negociação por meio da análise de quadros de tempo múltiplos e de um rigoroso processo de confirmação de sinais. A vantagem central da estratégia reside em suas condições de entrada abrangentes e no sistema de gerenciamento de risco, especialmente o mecanismo de parada em dois estágios que permite bloquear os lucros enquanto mantém a tendência de rastreamento de algumas posições.
No entanto, a eficácia da estratégia é altamente dependente da configuração dos parâmetros e das condições do mercado. Pode ter um bom desempenho em mercados turbulentos, mas pode precisar de ajustes em ambientes de forte tendência ou alta volatilidade. É recomendado que os comerciantes otimizem os parâmetros através de histórico de retrospectiva e considerem adicionar recursos como detecção de estado do mercado e mecanismos de suspensão dinâmica para aumentar sua adaptabilidade.
A estratégia é mais adequada para os intermediários a comerciantes avançados com conhecimentos de programação, que são capazes de entender e personalizar essas regras de negociação complexas. Com o ajuste de parâmetros e o gerenciamento de risco apropriados, o sistema pode ser uma parte valiosa do kit de ferramentas dos comerciantes diários e de curto prazo, especialmente aqueles que se concentram em capturar as mudanças na dinâmica do mercado.
/*backtest
start: 2024-06-05 00:00:00
end: 2025-06-04 00:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Archertoria
//@version=6
strategy("System 0530 - Stoch RSI Strategy v13 SL-Priority TP-Reversal",
overlay=true,
default_qty_type=strategy.percent_of_equity,
default_qty_value=100,
calc_on_order_fills=false,
process_orders_on_close=true,
margin_short=50)
// --- Original Indicator Input Parameters ---
g_stoch = "Stochastic RSI Parameters"
rsi_len = input.int(14, "RSI Period", minval=1, group=g_stoch)
stoch_rsi_len = input.int(14, "Stochastic of RSI Period (K Period for Stoch)", minval=1, group=g_stoch)
stoch_k_smooth = input.int(3, "Stochastic %K Smoothing (D Period for Stoch)", minval=1, group=g_stoch)
stoch_d_smooth = input.int(3, "Stochastic %D Smoothing (Smoothing for final D)", minval=1, group=g_stoch)
g_signal = "Signal Trigger and Confirmation Parameters"
stoch_5min_k_long_trigger = input.float(40.0, "5-min Stoch K Long Trigger Level (K must be ≤ this value)", minval=0, maxval=100, step=0.1, group=g_signal, tooltip="On the 5-minute chart, when the K line crosses above the D line, the K value at that time must be less than or equal to this setting to initiate a long signal wait.")
stoch_5min_k_short_trigger = input.float(70.0, "5-min Stoch K Short Trigger Level (K must be ≥ this value)", minval=0, maxval=100, step=0.1, group=g_signal, tooltip="On the 5-minute chart, when the K line crosses below the D line, the K value at that time must be greater than or equal to this setting to initiate a short signal wait.")
stoch_15min_long_entry_level = input.int(50, "15-min Stoch K Long Confirmation Threshold (K must be below this value)", minval=0, maxval=100, group=g_signal, tooltip="On the 15-minute chart, for final long confirmation, the 15-minute K line value must be below this setting.")
stoch_15min_short_entry_level = input.int(70, "15-min Stoch K Short Confirmation Threshold (K must be above this value)", minval=0, maxval=100, group=g_signal, tooltip="On the 15-minute chart, for final short confirmation, the 15-minute K line value must be above this setting.")
wait_window_5min_bars = input.int(7, "Number of 5-min bars to wait for 15-min signal", minval=1, group=g_signal, tooltip="After a 5-minute signal is issued, wait for 15-minute signal confirmation within the next N 5-minute bars.")
g_repeat_filter = "Duplicate Signal Filtering Settings"
use_signal_cooldown_filter = input.bool(true, title="Enable Duplicate Signal Filter", group=g_repeat_filter, tooltip="Filters out duplicate signals in the same direction within a short period.")
min_bars_between_signals = input.int(12, title="Minimum Bars Between Same-Direction Signals", minval=1, group=g_repeat_filter, tooltip="After a signal is issued, at least this many bars must pass before another signal in the same direction can be issued.")
// --- Take Profit Parameters ---
g_tp_params = "Take Profit Parameters"
extreme_long_tp_level = input.float(95.0, "Extreme Long TP Level (Stoch K >)", minval=50, maxval=100, step=0.1, group=g_tp_params, tooltip="Direct TP for longs if 5-min OR 15-min Stoch K exceeds this.")
extreme_short_tp_level = input.float(5.0, "Extreme Short TP Level (Stoch K <)", minval=0, maxval=50, step=0.1, group=g_tp_params, tooltip="Direct TP for shorts if 5-min OR 15-min Stoch K is below this.")
// --- Strategy Specific Input Parameters ---
g_strategy = "Strategy Parameters"
leverage_multiplier = input.float(1.0, "Leverage Multiplier (Affects theoretical position size only)", minval=1.0, step=0.1, group=g_strategy, tooltip="Note: TradingView strategies do not directly simulate margin account liquidation. This leverage is used to calculate theoretical position size. Actual leverage effects must be realized with a broker that supports leverage.")
// --- Function: Calculate Stochastic RSI ---
getStochasticRSI(src, rsiLen, stochLen, kSmooth, dSmooth) =>
rsi_val = ta.rsi(src, rsiLen)
stoch_rsi_k_raw = ta.stoch(rsi_val, rsi_val, rsi_val, stochLen) // Stoch of RSI
stoch_rsi_k = ta.sma(stoch_rsi_k_raw, kSmooth)
stoch_rsi_d = ta.sma(stoch_rsi_k, dSmooth)
[stoch_rsi_k, stoch_rsi_d]
// --- Helper Function to get only K-series for Stochastic RSI (RE-ADDED for 15-min prev K) ---
getStochKSeriesOnly(src, rsiLen, stochLen, kSmooth, dSmooth) =>
rsi_val = ta.rsi(src, rsiLen)
stoch_rsi_k_raw = ta.stoch(rsi_val, rsi_val, rsi_val, stochLen)
stoch_rsi_k = ta.sma(stoch_rsi_k_raw, kSmooth)
stoch_rsi_k // Return only the K series
// --- Time Series Data Fetching and Stochastic RSI Calculation ---
[stoch_k_15min_val, stoch_d_15min_val] = request.security(syminfo.tickerid, "15", getStochasticRSI(close, rsi_len, stoch_rsi_len, stoch_k_smooth, stoch_d_smooth), lookahead=barmerge.lookahead_off)
// RE-ADDED: K value of the PREVIOUS 15-minute bar's Stochastic RSI
stoch_k_15min_prev_tf_bar = request.security(syminfo.tickerid, "15", nz(getStochKSeriesOnly(close, rsi_len, stoch_rsi_len, stoch_k_smooth, stoch_d_smooth)[1]), lookahead=barmerge.lookahead_off)
[stoch_k_5min_val, stoch_d_5min_val] = getStochasticRSI(close, rsi_len, stoch_rsi_len, stoch_k_smooth, stoch_d_smooth)
// --- Signal Logic State Variables ---
var bool waiting_for_15m_long_confirm = false
var bool waiting_for_15m_short_confirm = false
var int bars_elapsed_in_wait_state = 0
var int last_long_signal_bar_idx = -min_bars_between_signals
var int last_short_signal_bar_idx = -min_bars_between_signals
// --- Variables to store SL reference points from ENTRY bar ---
var float entry_bar_low_for_sl = na
var float entry_bar_high_for_sl = na
// --- Take Profit Logic State Variables ---
var bool first_tp_long_taken = false
var bool first_tp_short_taken = false
// RE-ADDED: State variables for pending TP confirmation on 15-min reversal
var bool pending_long_tp_on_15m_reversal = false
var bool pending_short_tp_on_15m_reversal = false
// --- Detect 5-minute Stochastic RSI crossover events for ENTRY ---
bool stoch_5min_crossed_up_prev_bar = ta.crossover(stoch_k_5min_val[1], stoch_d_5min_val[1])
bool stoch_5min_crossed_down_prev_bar = ta.crossunder(stoch_k_5min_val[1], stoch_d_5min_val[1])
bool condition_5min_k_level_for_long_trigger = stoch_k_5min_val[1] <= stoch_5min_k_long_trigger
bool condition_5min_k_level_for_short_trigger = stoch_k_5min_val[1] >= stoch_5min_k_short_trigger
// --- Specific 5-minute Stochastic RSI crossover for Take Profit (current bar) ---
bool stoch_5min_k_cross_under_d_tp = ta.crossunder(stoch_k_5min_val, stoch_d_5min_val) // For Long TP trigger
bool stoch_5min_k_cross_over_d_tp = ta.crossover(stoch_k_5min_val, stoch_d_5min_val) // For Short TP trigger
// --- RE-ADDED: 15-minute Reversal Confirmation for Take Profit ---
bool confirm_15m_reversal_for_long_tp = stoch_k_15min_val < stoch_k_15min_prev_tf_bar
bool confirm_15m_reversal_for_short_tp = stoch_k_15min_val > stoch_k_15min_prev_tf_bar
// --- Manage waiting state and tolerance period for ENTRY ---
if (strategy.position_size == 0)
if (stoch_5min_crossed_up_prev_bar and condition_5min_k_level_for_long_trigger)
can_trigger_new_long = not use_signal_cooldown_filter or (bar_index - last_long_signal_bar_idx >= min_bars_between_signals)
if (can_trigger_new_long)
waiting_for_15m_long_confirm := true
waiting_for_15m_short_confirm := false
bars_elapsed_in_wait_state := 1
else if (stoch_5min_crossed_down_prev_bar and condition_5min_k_level_for_short_trigger)
can_trigger_new_short = not use_signal_cooldown_filter or (bar_index - last_short_signal_bar_idx >= min_bars_between_signals)
if (can_trigger_new_short)
waiting_for_15m_short_confirm := true
waiting_for_15m_long_confirm := false
bars_elapsed_in_wait_state := 1
else if (waiting_for_15m_long_confirm or waiting_for_15m_short_confirm)
bars_elapsed_in_wait_state += 1
if (bars_elapsed_in_wait_state > wait_window_5min_bars)
waiting_for_15m_long_confirm := false
waiting_for_15m_short_confirm := false
bars_elapsed_in_wait_state := 0
else
waiting_for_15m_long_confirm := false
waiting_for_15m_short_confirm := false
bars_elapsed_in_wait_state := 0
// --- 15-minute Stochastic RSI confirmation conditions for ENTRY (Strict Crossover) ---
bool confirm_15min_long_stoch_kd_cond = stoch_k_15min_val > stoch_d_15min_val // K must be strictly greater than D
bool confirm_15min_short_stoch_kd_cond = stoch_k_15min_val < stoch_d_15min_val // K must be strictly less than D
bool filter_15min_stoch_level_long = stoch_k_15min_val < stoch_15min_long_entry_level
bool filter_15min_stoch_level_short = stoch_k_15min_val > stoch_15min_short_entry_level
// --- Main Signal Determination (for strategy logic) ---
entry_long_signal = false
entry_short_signal = false
if (strategy.position_size == 0)
if (waiting_for_15m_long_confirm and bars_elapsed_in_wait_state <= wait_window_5min_bars)
if (confirm_15min_long_stoch_kd_cond and filter_15min_stoch_level_long)
can_confirm_new_long = not use_signal_cooldown_filter or (bar_index - last_long_signal_bar_idx >= min_bars_between_signals)
if (can_confirm_new_long)
entry_long_signal := true
if (waiting_for_15m_short_confirm and bars_elapsed_in_wait_state <= wait_window_5min_bars)
if (confirm_15min_short_stoch_kd_cond and filter_15min_stoch_level_short)
can_confirm_new_short = not use_signal_cooldown_filter or (bar_index - last_short_signal_bar_idx >= min_bars_between_signals)
if (can_confirm_new_short)
entry_short_signal := true
// --- Strategy Execution Logic ---
// Reset SL ref and TP flags if position just closed
if (strategy.position_size == 0 and strategy.position_size[1] != 0)
first_tp_long_taken := false
first_tp_short_taken := false
entry_bar_low_for_sl := na
entry_bar_high_for_sl := na
pending_long_tp_on_15m_reversal := false // Reset pending TP flag
pending_short_tp_on_15m_reversal := false // Reset pending TP flag
if (entry_long_signal)
strategy.entry("LE", strategy.long, comment="Long Entry")
last_long_signal_bar_idx := bar_index
waiting_for_15m_long_confirm := false
bars_elapsed_in_wait_state := 0
first_tp_long_taken := false
entry_bar_low_for_sl := low
entry_bar_high_for_sl := na
pending_long_tp_on_15m_reversal := false // Reset for new trade
pending_short_tp_on_15m_reversal := false
if (entry_short_signal)
strategy.entry("SE", strategy.short, comment="Short Entry")
last_short_signal_bar_idx := bar_index
waiting_for_15m_short_confirm := false
bars_elapsed_in_wait_state := 0
first_tp_short_taken := false
entry_bar_high_for_sl := high
entry_bar_low_for_sl := na
pending_short_tp_on_15m_reversal := false // Reset for new trade
pending_long_tp_on_15m_reversal := false
// --- Stop Loss Logic (PRIORITY 1) ---
// Check and execute SL first. If SL triggers, position size becomes 0, preventing TP logic below from executing on the same bar.
bool sl_triggered_this_bar = false
if (strategy.position_size > 0) // If in a long trade
if (not na(entry_bar_low_for_sl) and close < entry_bar_low_for_sl)
strategy.close(id="LE", comment="SL Long")
sl_triggered_this_bar := true
pending_long_tp_on_15m_reversal := false // Ensure pending TP is cancelled if SL hits
if (strategy.position_size < 0) // If in a short trade
if (not na(entry_bar_high_for_sl) and close > entry_bar_high_for_sl)
strategy.close(id="SE", comment="SL Short")
sl_triggered_this_bar := true
pending_short_tp_on_15m_reversal := false // Ensure pending TP is cancelled if SL hits
// --- Take Profit Logic (PRIORITY 2 - only if SL did not trigger on this bar) ---
if (not sl_triggered_this_bar) // Only proceed with TP if SL hasn't already closed the position on this bar
if (strategy.position_size > 0) // --- LONG TP LOGIC ---
extreme_long_tp_condition = stoch_k_5min_val > extreme_long_tp_level or stoch_k_15min_val > extreme_long_tp_level
if (extreme_long_tp_condition)
if (not first_tp_long_taken)
strategy.close(id="LE", comment="TP1 Long", qty_percent=50)
first_tp_long_taken := true
else
strategy.close(id="LE", comment="TP2 Long")
pending_long_tp_on_15m_reversal := false // Reset pending state as this TP takes precedence
else
// Conditional TP logic (5-min trigger + 15-min reversal)
if (stoch_5min_k_cross_under_d_tp and not pending_long_tp_on_15m_reversal) // Set pending state
pending_long_tp_on_15m_reversal := true
if (pending_long_tp_on_15m_reversal and confirm_15m_reversal_for_long_tp) // Check for confirmation
if (not first_tp_long_taken)
strategy.close(id="LE", comment="TP1 Long", qty_percent=50)
first_tp_long_taken := true
else
strategy.close(id="LE", comment="TP2 Long")
pending_long_tp_on_15m_reversal := false // Reset after TP
if (strategy.position_size < 0) // --- SHORT TP LOGIC ---
extreme_short_tp_condition = stoch_k_5min_val < extreme_short_tp_level or stoch_k_15min_val < extreme_short_tp_level
if (extreme_short_tp_condition)
if (not first_tp_short_taken)
strategy.close(id="SE", comment="TP1 Short", qty_percent=50)
first_tp_short_taken := true
else
strategy.close(id="SE", comment="TP2 Short")
pending_short_tp_on_15m_reversal := false // Reset pending state
else
// Conditional TP logic (5-min trigger + 15-min reversal)
if (stoch_5min_k_cross_over_d_tp and not pending_short_tp_on_15m_reversal) // Set pending state
pending_short_tp_on_15m_reversal := true
if (pending_short_tp_on_15m_reversal and confirm_15m_reversal_for_short_tp) // Check for confirmation
if (not first_tp_short_taken)
strategy.close(id="SE", comment="TP1 Short", qty_percent=50)
first_tp_short_taken := true
else
strategy.close(id="SE", comment="TP2 Short")
pending_short_tp_on_15m_reversal := false // Reset after TP