
A estratégia é uma estratégia de negociação de indicadores de quantidade de preço em vários períodos de tempo. Ela usa um índice de força e fraqueza relativamente forte (RSI), amplitude real média (ATR), média móvel simples (SMA) e condições de quantidade personalizadas para identificar potenciais sinais de fazer mais.
A estratégia baseia-se principalmente nos seguintes pontos-chave:
Especificamente, a estratégia define os parâmetros de comprimento e de linha de superação para o indicador RSI, com base nesses parâmetros, o valor do RSI é calculado. Quando o indicador RSI tem várias linhas K consecutivas abaixo da linha de superação, um sinal de superação é gerado.
Além disso, a estratégia define 3 valores de volume de transação, com base em dados de diferentes períodos de tempo, definindo vários conjuntos de condições de volume. Por exemplo, um valor de 90 ciclos é maior que 1,5 vezes o valor de 49 ciclos. Quando essas condições de volume são simultaneamente satisfeitas, é emitido um sinal de multiplicação do indicador de volume.
Em termos de preço, a estratégia calcula um indicador SMA de 13 ciclos e estatística o número de linhas K desde que o preço se elevou acima da SMA. Quando o preço se elevava abaixo da SMA e o número de linhas K após a quebra é inferior a 5, é considerado um sinal de ruptura do preço.
Em termos de parâmetros de ATR, a estratégia especifica ATRs para o ciclo pequeno 5 e o ciclo grande 14. Quando o ATR do ciclo pequeno é menor que o ATR do ciclo grande, a aceleração da volatilidade do mercado é reduzida, como sinal de aumento.
Por fim, a estratégia leva em consideração as condições de compra acima, incluindo a sobrevenda, o indicador de quantidade, a ruptura de preço e o indicador ATR. Quando essas condições são simultaneamente satisfeitas, o sinal de compra final é gerado e uma posição de compra é estabelecida.
A estratégia tem as seguintes vantagens:
A estratégia não considera apenas os dados de preços de um único período, mas avalia a interseção de vários grupos de diferentes condições de preços de períodos, o que permite determinar com mais precisão a concentração de quantidades.
O mecanismo de triplo julgamento de supervenda + preço + quantidade garante a confiabilidade do sinal de compra. A supervenda fornece a escolha mais básica do momento de compra, além disso, o cruzamento dos indicadores de quantidade e preço aumenta a confirmação adicional para o momento de compra, com maior confiabilidade.
A configuração de um mecanismo de stop-loss para controlar rigorosamente o risco de cada transação. Os parâmetros de stop-loss e stop-loss podem ser ajustados de acordo com as preferências de risco individuais, para controlar razoavelmente o risco de cada transação, enquanto se busca maximizar os lucros.
A integração de vários indicadores de julgamento aumenta a flexibilidade. Mesmo se alguns indicadores falharem ou errarem, pode-se confiar em outros indicadores de julgamento para garantir uma certa capacidade de operação contínua.
A estratégia também apresenta alguns riscos:
Configuração de parâmetros de risco. A configuração de parâmetros de todos os tipos de indicadores afeta diretamente os resultados do julgamento. Parâmetros irracionais podem levar ao desvio do sinal de negociação.
O espaço de ganho é limitado. Como uma estratégia para a integração de vários indicadores de fusão para o julgamento integrado, a frequência de geração de sinais é relativamente mais conservadora, o número de transações por unidade de tempo é menor e o espaço de ganho é limitado.
Risco de dispersação de indicadores. Quando alguns indicadores emitem sinais de fazer mais e outros emitem sinais de fazer menos, a estratégia não pode determinar a melhor decisão. Isso requer a identificação e resolução antecipada de possíveis dispersas entre os indicadores.
A estratégia pode ser ainda melhorada em alguns aspectos:
Aumentar o julgamento auxiliado por modelos de aprendizagem de máquina. Pode treinar modelos de preços de quantidade e características de flutuação, auxiliando os parâmetros definidos manualmente, realizando a dinamização dos parâmetros.
Aumentar a maturidade da estratégia de stop-loss. Por exemplo, pode-se configurar stop-loss flutuante, stop-loss em lotes, stop-loss de rastreamento, etc.
Avaliação de dados de abertura introduzidos. Além dos dados de quantidade de linha K, os dados de abertura de compra e venda em profundidade também podem ser usados para avaliar a distribuição de posições, fornecendo sinais de referência adicionais.
Teste e verifique a integração de outros indicadores. Esta estratégia usa principalmente indicadores como RSI, ATR e SMA para a integração, mas também pode tentar introduzir combinações de outros indicadores, como linhas de Brin e KDJ, para enriquecer e otimizar a fonte de sinal de negociação.
Esta estratégia utiliza o RSI, o ATR, o SMA e os critérios de avaliação de preços personalizados para identificar potenciais oportunidades de negociação. Além disso, possui vantagens como a avaliação de indicadores de preços de vários quadros temporais, o mecanismo de confirmação de três sinais e o risco de controle de stop loss. É claro que também é necessário prestar atenção ao risco de configuração de parâmetros, limitações de espaço de ganho.
/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// © Kimply_Tr
//@version=5
// Strategy settings and parameters
strategy(title='Volume ValueWhen Velocity', overlay=true)
// Define the stop-loss and take-profit percentages for the long strategy
long_stoploss_value = input.float(defval=3, title='Stop-Loss (SL) %', minval=0, group='▶ Stop Loss/Take Profit => Long-Strategy', inline='2')
long_stoploss_percentage = close * (long_stoploss_value / 100) / syminfo.mintick // Calculate long stop-loss percentage
long_takeprofit_value = input.float(defval=2, title='Take-Profit (TP) %', minval=0, group='▶ Stop Loss/Take Profit => Long-Strategy', inline='2')
long_takeprofit_percentage = close * (long_takeprofit_value / 100) / syminfo.mintick // Calculate long take-profit percentage
// Define parameters related to ValueWhen occurrences
occurrence_ValueWhen_1 = input.int(title='occurrence_ValueWhen_1', defval=1, maxval=100, step=1, group="▶ ValueWhen",tooltip ="Its value must be smaller than (occurrence_ValueWhen_2)")
occurrence_ValueWhen_2 = input.int(title='occurrence_ValueWhen_2', defval=5, maxval=100, step=1, group="▶ ValueWhen" ,tooltip="Its value must be greater than (occurrence_ValueWhen_1)")
distance_value=input.int(title='distance_value_occurrence', defval=170, maxval=5000, step=1, group="▶ ValueWhen" ,tooltip="It indicates the minimum distance between the occurrences of 1 and 2, i.e. the difference between the occurrences of 1 and 2 is greater than (distance_value_occurrence)")
// Define RSI-related parameters
rsi_over_sold = input.int(defval=60, minval=1, title='Oversold Level', group='▶ RSI',inline ='2') // Input for oversold level in RSI
rsi_length = input.int(defval=40, minval=1, title='RSI Length', group='▶ RSI',inline ='2') // Input for RSI length
rsi = ta.rsi(close, rsi_length) // Calculate RSI
// Define volume thresholds
volume_threshold1 = input.float(title='volume_threshold_1', defval=0.5, maxval=10, step=0.1, group="▶ Volume")
volume_threshold2 = input.float(title='volume_threshold_2', defval=0.4, maxval=10, step=0.1, group="▶ Volume")
volume_threshold3 = input.float(title='volume_threshold_3', defval=0.62, maxval=10, step=0.1, group="▶ Volume")
// ATR (Average True Range)
// Define ATR parameters
atr_small = input.int(title='ATR_Small', defval=5, maxval=500, step=1, group="▶ Atr",inline ='2')
atr_big = input.int(title='ATR_Big ', defval=14, maxval=500, step=1, group="▶ Atr",inline ='2')
atr_value3 = ta.atr(15) // Calculate ATR value 3
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Date Range
// Define the date range for back-testing
start_date = input.int(title='Start Day', defval=1, minval=1, maxval=31, group='▶ Time-Period for Back-Testing', inline='1') // Input for start day
end_date = input.int(title='until Day', defval=1, minval=1, maxval=31, group='▶ Time-Period for Back-Testing', inline='1') // Input for end day
start_month = input.int(title='Start Month', defval=7, minval=1, maxval=12, group='▶ Time-Period for Back-Testing', inline='2') // Input for start month
end_month = input.int(title='until Month', defval=1, minval=1, maxval=12, group='▶ Time-Period for Back-Testing', inline='2') // Input for end month
start_year = input.int(title='Start Year', defval=2022, minval=1800, maxval=3000, group='▶ Time-Period for Back-Testing', inline='3') // Input for start year
end_year = input.int(title='until Year', defval=2077, minval=1800, maxval=3000, group='▶ Time-Period for Back-Testing', inline='3') // Input for end year
in_date_range = time >= timestamp(syminfo.timezone, start_year, start_month, start_date, 0, 0) and time < timestamp(syminfo.timezone, end_year, end_month, end_date, 0, 0) // Check if the current time is within the specified date range
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
was_over_sold = ta.barssince(rsi <= rsi_over_sold) <= 10 // Check if RSI was oversold in the last 10 bars
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
getVolume(symbol, bar) =>
request.security(syminfo.tickerid, "D", volume)[bar] // Function to get volume data for a specific symbol and bar
getVolume2(symbol, bar) =>
request.security(syminfo.tickerid, "39", volume)[bar] // Function to get volume data for a specific symbol and bar 2
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
firstCandleColor1 = request.security(syminfo.tickerid, "D", close[2] > open[1] ? 1 : 0)
firstCandleColor2 = request.security(syminfo.tickerid, "1", close[2] > open[0] ? 1 : 0)
firstCandleColor3 = request.security(syminfo.tickerid, "W", close[1] > open[1] ? 1 : 0)
firstCandleColor= ((firstCandleColor1+firstCandleColor2)) > firstCandleColor3 ? 1 : 0
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sma = ta.sma(close, 13) // Calculate the simple moving average (SMA) of the close price over 13 periods
numCandles = ta.barssince(close > sma) // Count the number of candles since the close price crossed above the SMA
atr1=request.security(syminfo.tickerid, "30", ta.atr(atr_small)<ta.atr(atr_big)) // Get the ATR value for the specific security and timeframe (30 minutes) and check if ATR_small is less than ATR_big
prevClose = ta.valuewhen(close > sma, close, occurrence_ValueWhen_1) // Get the close price when it first crosses above the SMA based on occurrence_ValueWhen_1
prevCloseBarsAgo = ta.valuewhen(close > sma, close, occurrence_ValueWhen_2) // Get the close price when it first crosses above the SMA based on occurrence_ValueWhen_2
prevCloseChange = (prevCloseBarsAgo - prevClose ) // Calculate the change in the close price between the occurrences of crossing above the SMA
atrval=(atr_value3>140) or (atr_value3 < 123) // Check if atr_value3 is either greater than 140 or less than 123
Condition = getVolume(syminfo.tickerid, 90) > volume_threshold1 * getVolume(syminfo.tickerid, 49) and getVolume(syminfo.tickerid, 110) > volume_threshold3 * getVolume(syminfo.tickerid, 49) and getVolume2(syminfo.tickerid, 30) > volume_threshold2 * getVolume2(syminfo.tickerid, 55) and getVolume2(syminfo.tickerid, 7) > volume_threshold2 * getVolume2(syminfo.tickerid, 3) // Check multiple volume conditions
buy_signal=Condition and atrval and firstCandleColor==0 and was_over_sold and prevCloseChange> distance_value and atr1 and numCandles<5 // Determine if the buy signal is generated based on various conditions
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Long Strategy
// Enter long position if the buy signal conditions are met and within the specified date range
if buy_signal and in_date_range
strategy.entry('Long', strategy.long, alert_message='Open Long Position') // Enter long position
strategy.exit('Long SL/TP', from_entry='Long', loss=long_stoploss_percentage, profit=long_takeprofit_percentage, alert_message='Your SL/TP-Limit for the Long-Strategy has been activated.') // Exit long position with stop-loss and take-profit