Esta estratégia é uma estratégia de negociação de indicadores de preço de volume de vários prazos. Utiliza de forma abrangente o índice de força relativa (RSI), a faixa média verdadeira (ATR), a média móvel simples (SMA) e as condições de preço de volume personalizadas para identificar possíveis sinais longos. Quando certos sinais de sobrevenda, cruzamento de preço de volume, quebra de preço e outras condições de entrada são atendidas, esta estratégia estabelecerá posições longas.
Os pontos-chave desta estratégia são:
Especificamente, esta estratégia define os parâmetros de comprimento e sobrevenda para o indicador RSI e calcula os valores do RSI com base nesses parâmetros.
Além disso, a estratégia define 3 limiares de volume e estabelece vários conjuntos de condições de preço de volume com base em dados de diferentes prazos. Por exemplo, o valor de volume do período de 90 é maior que 1,5 vezes o do período de 49.
No aspecto do preço, a estratégia calcula a SMA de 13 períodos e conta o número de barras desde que o preço rompe acima da SMA.
Para os parâmetros do período ATR, esta estratégia especifica um período pequeno de 5 e um período grande de 14 para o ATR.
Por último, a estratégia tem em conta todos os critérios de entrada acima referidos, incluindo os indicadores de sobrevenda, preço de volume, ruptura de preços e ATR. Quando todas estas condições são satisfeitas ao mesmo tempo, o sinal longo final é acionado e uma posição longa é estabelecida.
Esta estratégia tem as seguintes vantagens:
O julgamento da condição de preço do volume em vários prazos melhora a precisão.
O mecanismo de confirmação tripla de sobrevenda + preço de volume + ruptura de preço garante sinais de entrada confiáveis.
O mecanismo de stop loss e take profit controla estritamente o risco por negociação. Os parâmetros de stop loss e take profit podem ser ajustados com base no apetite de risco pessoal para maximizar os lucros, controlando razoavelmente o risco por negociação.
A integração de múltiplos indicadores aumenta a robustez. Mesmo que alguns indicadores falhem ou funcionem mal, a estratégia pode ainda confiar em outros indicadores para julgamento e garantir um certo nível de resiliência.
Há também alguns riscos com esta estratégia:
Risco de configuração de parâmetros. As configurações de parâmetros dos indicadores afetam diretamente o julgamento e parâmetros inadequados podem levar a viés nos sinais de negociação. Os valores razoáveis dos parâmetros precisam ser cuidadosamente validados.
Como uma estratégia que integra múltiplos indicadores para julgamento coletivo, seus sinais tendem a ser mais conservadores com relativamente menos negociações por unidade de tempo, portanto, o potencial de lucro tem algumas restrições.
Risco de divergência de indicadores: quando alguns indicadores emitem sinais longos e outros sinais curtos, a estratégia não pode determinar a decisão ideal.
Esta estratégia pode ser melhorada nos seguintes aspectos:
Incorporar modelos de aprendizagem de máquina para auxiliar o julgamento. Os modelos podem ser treinados sobre as características de preço de volume e volatilidade para ajustar dinamicamente os parâmetros definidos manualmente.
Melhorar a sofisticação das estratégias de captação de lucro, tais como captação de lucro por paralisação, captação parcial de lucros, etc., para aumentar ainda mais o lucro por negócio, evitando a perda de lucro.
Avaliação incorporando dados da carteira de ordens Além dos dados do gráfico de preços e volume, os dados da carteira de ordens também revelam informações de distribuição de liquidez de profundidade para fornecer sinais de referência suplementares.
Combinações de testes com outros indicadores. Esta estratégia utiliza principalmente indicadores como RSI, ATR e SMA. Outros indicadores como Bollinger Bands e KDJ também podem ser combinados para diversificar e otimizar as fontes de sinais de negociação.
Esta estratégia utiliza uma combinação de indicadores, incluindo RSI, ATR, SMA e condições de preço de volume personalizadas para identificar oportunidades de entrada de volume longo em potencial. Ela tem vantagens como avaliação de preço de volume em vários prazos, mecanismo de confirmação tripla e controles de risco de stop loss / take profit. No entanto, riscos como configuração de parâmetros, potencial de lucro restrito também precisam ser notados. No futuro, esta estratégia pode ser melhorada através do aumento do aprendizado de máquina, design de lucro mais sofisticado, incorporação de dados de livro de pedidos, bem como combinações de indicadores expandidas.
/*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