Indicador de preço de volume Estratégia de negociação equilibrada

Autora:ChaoZhang, Data: 2023-11-24 14:35:13
Tags:

img

Resumo

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.

Estratégia lógica

Os pontos-chave desta estratégia são:

  1. Quando o RSI está abaixo do nível de sobrevenda e permanece sobrevendo durante os últimos 10 bares, é considerado um sinal de sobrevenda.
  2. São definidos múltiplos conjuntos de condições de preço de volume e todas estas condições devem ser satisfeitas ao mesmo tempo para desencadear o sinal longo do indicador de preço de volume
  3. Quando o preço de fechamento ultrapassa a SMA de 13 períodos, é considerado um sinal de ruptura do preço
  4. O período pequeno ATR sendo menor do que o período grande ATR também é um sinal longo contribuição
  5. A estratégia combina todos os sinais acima para tomar a decisão final de entrada longa

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.

Vantagens

Esta estratégia tem as seguintes vantagens:

  1. O julgamento da condição de preço do volume em vários prazos melhora a precisão.

  2. O mecanismo de confirmação tripla de sobrevenda + preço de volume + ruptura de preço garante sinais de entrada confiáveis.

  3. 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.

  4. 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.

Riscos e contramedidas

Há também alguns riscos com esta estratégia:

  1. 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.

  2. 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.

  3. 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.

Orientações de otimização

Esta estratégia pode ser melhorada nos seguintes aspectos:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Conclusã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




Mais.