Estrategia comercial basada en el impulso


Fecha de creación: 2023-12-20 16:06:26 Última modificación: 2023-12-20 16:06:26
Copiar: 0 Número de Visitas: 651
1
Seguir
1621
Seguidores

Estrategia comercial basada en el impulso

Descripción general de la estrategia

La estrategia de seguimiento de la dinámica es una estrategia de negociación automatizada basada en la tendencia de seguimiento de la dinámica del mercado, combinada con varios indicadores técnicos como juicio auxiliar. La estrategia analiza la información de la línea K para determinar la dirección y la intensidad de los fondos dominantes en el mercado actual, y luego emite una señal de negociación en combinación con indicadores técnicos como el indicador de precio de volumen, la media móvil y otros, para lograr el seguimiento de tendencias.

En general, la estrategia es adecuada para el comercio de tendencias de línea media y larga, capaz de capturar eficazmente las tendencias del mercado, reducir la frecuencia de las operaciones y buscar mayores ganancias individuales. Además, se puede utilizar para el comercio de líneas cortas después de optimizar los parámetros de la estrategia.

Principio de estrategia

El juicio dominante

El núcleo de la estrategia de seguimiento de la dinámica es determinar la dirección de los fondos dominantes en el mercado. La estrategia monitorea la volatilidad del mercado en tiempo real mediante el cálculo de los indicadores de ATR. Cuando la volatilidad aumenta, la estrategia se retira temporalmente del mercado para evitar el período de tiempo en el que se está acumulando o distribuyendo la fuerza dominante.

Cuando la oscilación se atenúa, la estrategia vuelve a entrar en juego para determinar la dirección específica de la fuerza dominante. La forma de determinar es calcular la posición de la presión de soporte del mercado para ver si hay signos de ruptura. Si hay una ruptura clara, confirma que la fuerza dominante eligió esa dirección.

Juzgado auxiliar

Después de determinar la dirección de la fuerza principal, la estrategia también introduce varios indicadores técnicos auxiliares para verificarlos nuevamente para evitar errores de juicio. En concreto, se calculan indicadores como MACD, KDJ y otros para determinar si coinciden con la dirección de la fuerza principal.

La estrategia abre posiciones de creación de posiciones solo cuando la dirección principal y los indicadores auxiliares emiten señales homotérmicas. Esto controla eficazmente la frecuencia de negociación y solo entra en operaciones con una alta probabilidad.

Cesación de pérdidas

Después de la creación de la posición, la estrategia de seguimiento de la dinámica seguirá los cambios en los precios en tiempo real y utilizará la expansión del valor de ATR como señal de parada. Esto significa que el mercado vuelve a entrar en la fase de operación de fuerza principal y debe retirarse de inmediato a la caja para evitar ser cubierto.

Además, si el precio se mueve más allá de un cierto rango, la corrección se detendrá. Esto es una corrección técnica normal, y el control del riesgo debe detenerse inmediatamente.

Ventajas estratégicas

Fuerte sistematización

La mayor ventaja de la estrategia de seguimiento de la dinámica es que es altamente sistematizada y reglamentada. Su lógica de transacción es clara, cada entrada y salida tiene principios y reglas claras, no hay transacciones al azar.

Esto hace que la estrategia sea muy reproducible y que los usuarios puedan configurar aplicaciones a largo plazo sin necesidad de intervención humana.

Control de riesgos en el lugar

Las estrategias incorporan mecanismos de control de riesgo a varios niveles, como el juicio de la fuerza principal, la verificación auxiliar y la formulación de la línea de parada, que pueden controlar eficazmente el riesgo no sistemático.

En concreto, la estrategia consiste en abrir posiciones solo en casos de alta probabilidad y establecer un stop loss científico para evitar al máximo la expansión de las pérdidas. Esto garantiza un crecimiento estable de los fondos.

Los beneficios son más sostenibles

En comparación con las estrategias de línea corta, las estrategias de seguimiento de impulso tienen un período de tenencia más largo y una mayor ganancia por operación. Esto hace que las ganancias generales de las estrategias sean más estables y sostenibles.

Además, la estrategia de seguimiento de tendencias medias y largas captura la volatilidad de las tendencias, que es especialmente evidente en las tendencias grandes.

Alerta de riesgo

Optimización de parámetros muy difícil

Las estrategias de seguimiento de la fuerza implican una mayor cantidad de parámetros, como parámetros ATR, parámetros de ruptura, parámetros de parada, etc. Hay cierta correlación entre estos parámetros, que requiere pruebas repetitivas para encontrar la combinación óptima de parámetros.

Si la configuración de los parámetros es incorrecta, es muy probable que se produzca un exceso de frecuencia de transacción o un control insuficiente del riesgo. Esto requiere que el usuario tenga cierta experiencia en optimización de estrategias.

La brecha es fácil de atrapar.

Las estrategias para juzgar la fuerza dominante y las señales del indicador dependen de la ruptura del precio para confirmarla. Sin embargo, las operaciones de ruptura son propensas a la aparición de falsas rupturas, lo que puede conducir a una mayor probabilidad de que la posición sea cubierta.

Si se produce un fracaso en una brecha clave, puede haber grandes pérdidas. Esta es una debilidad interna de la estrategia.

Optimización de las ideas

Introducción al aprendizaje automático

Los algoritmos de aprendizaje automático pueden detectar correlaciones entre los parámetros para encontrar la combinación óptima de parámetros. Esto es mucho más eficiente que las pruebas manuales.

En concreto, se puede utilizar el algoritmo de EnvironmentError, basado en el aprendizaje por refuerzo de parámetros iterativos, para maximizar los beneficios de la estrategia.

Añadir un filtro

Se pueden introducir más filtros auxiliares sobre la base de los indicadores existentes, como el indicador de volumen de transacciones, el indicador de flujo de fondos, etc., para verificar tres o cuatro veces las señales de ruptura, con mayor fiabilidad.

Pero demasiados filtros también pueden causar oportunidades perdidas, por lo que se debe equilibrar la intensidad de los filtros. Además, los filtros mismos deben evitar la correlación.

Fusión de estrategias

El uso de la estrategia de seguimiento de movimiento en combinación con otras estrategias puede aprovechar las ventajas de las diferentes estrategias para lograr la positividad y mejorar la estabilidad general.

Por ejemplo, la combinación de estrategias de reversión a corto plazo con la apertura de operaciones de reversión después de la ruptura puede bloquear más ganancias.

Resumir

La estrategia de seguimiento de la dinámica es una estrategia de seguimiento de tendencias sistematizada que se recomienda en general. La lógica de la negociación es clara, el riesgo está controlado y puede generar un retorno de inversión estable y eficiente para los usuarios.

Sin embargo, la estrategia en sí misma también tiene ciertas deficiencias inherentes, que requieren que el usuario tenga la capacidad de optimizar los parámetros y la integración de la estrategia para obtener el máximo rendimiento de la estrategia. En general, la estrategia de seguimiento de impulso es un producto cuantitativo adecuado para los amantes de la estrategia con una cierta base cuantitativa.

Código Fuente de la Estrategia
/*backtest
start: 2023-12-12 00:00:00
end: 2023-12-15 01:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Created by frasmac2k Strategy credit to Alex Morris

//@version=5
strategy("Mechanical", shorttitle="MECH", overlay=true)

// Get the current date and time
currentYear = year
currentMonth = month
currentDay = dayofmonth

// Create a timestamp for the present date and time
currentTimestamp = timestamp(currentYear, currentMonth, currentDay)

// Define time interval for backtesting
dStart = input(timestamp('2023-07-01'), title='Set Start date', tooltip='Select a start date to run the script from')

// Define direction of strategy
direction = input.string('Forward',title='Direction', tooltip='Forward will go LONG on a Green anchor candle. Inverse will go short on a Green anchor candle and vice versa for Red candle', options=['Forward', 'Inverse'])

// Define the anchor hour as user input with a range of 0 to 23
anchorHour = input.int(11, title="Anchor Hour", tooltip='Set the hour to trade', minval=0, maxval=23)

// Define the take profit and stop loss in pips
takeProfitPips = input.int(10, title='Define TP Pips', tooltip='How many pips do you want to set TP. Choose a sensible value related to the instrument', minval=5)
stopLossPips = input.int(10,'Define SL Pips', tooltip='How many pips do you want to set SL. Choose a sensible value related to the instrument', minval=5)

// Define Tick size
tick10p = input.int(100, title='tick size', tooltip='Choose how many ticks equal 10 pips. This can vary by broker so measure 10 pips on the chart and select how many ticks that equates to. Forex is typically 100. Some instruments such as indices can be 1000', options=[100,1000])

// Declare TP/SL variables
var float takeProfit = na
var float stopLoss = na

// Calculate take profit and stop loss levels in ticks
if tick10p == 100
    takeProfit := takeProfitPips * 10
    stopLoss := stopLossPips * 10
if tick10p == 1000
    takeProfit := takeProfitPips * 100
    stopLoss := stopLossPips * 100

// Declare offset time
var int offset = na

if currentTimestamp > timestamp('2023-10-29')
    offset := 4
else
    offset := 5

//adjust for exchange time
anchorHour := anchorHour - offset

// Define the anchor hour as user input with a range of 0 to 23
tradeHour = anchorHour

// Define logical check for strategy date range
isStratTime = true

// Calculate the time condition for placing the order at the user-defined hour (start of the next hour)
isTradeTime = true

// Logic condition for forwards or inverse
isForward = direction == 'Forward'
isInverse = direction == 'Inverse'

// Declare entry condition variables
var bool longCondition = na
var bool shortCondition = na

// Declare and initialize variables for anchorCandle open and close prices
var float anchorOpen = na
var float anchorClose = na
var float tradeOpen = na
var float tradeClose = na

// Set logic by direction

if isForward
    // Strategy logic
    if isTradeTime and isStratTime
        //Obtain candle open/close
        anchorOpen := open
        anchorClose := close
        // Define entry conditions
        longCondition := anchorClose > anchorOpen
        shortCondition := anchorClose < anchorOpen
        
        // Entry logic
        if longCondition
            strategy.entry("Long", strategy.long)
            strategy.exit("Exit Long", from_entry="Long", profit=takeProfit, loss=stopLoss, comment_profit='TP', comment_loss='SL')
        if shortCondition
            strategy.entry("Short", strategy.short)
            strategy.exit("Exit Short", from_entry="Short", profit=takeProfit, loss=stopLoss, comment_profit='TP', comment_loss='SL')

if isInverse
    // Strategy logic
    if isTradeTime and isStratTime
        //Obtain candle open/close
        anchorOpen := open
        anchorClose := close
        // Define entry conditions
        shortCondition := anchorClose > anchorOpen
        longCondition := anchorClose < anchorOpen
        
        // Entry logic
        if longCondition
            strategy.entry("Long", strategy.long)
            strategy.exit("Exit Long", from_entry="Long", profit=takeProfit, loss=stopLoss, comment_profit='TP', comment_loss='SL')
        if shortCondition
            strategy.entry("Short", strategy.short)
            strategy.exit("Exit Short", from_entry="Short", profit=takeProfit, loss=stopLoss, comment_profit='TP', comment_loss='SL')

// Define the time range for the background shade
startHour = anchorHour
startMinute = 0
endHour = anchorHour
endMinute = 0

// Check if the current time is within the specified range
isInTimeRange = (hour == startHour and minute >= startMinute) or (hour == endHour and minute <= endMinute) or (hour > startHour and hour < endHour)

// Define the background color for the shade
backgroundColor = color.new(color.red, 90)

// Apply the background shade
bgcolor(isInTimeRange ? backgroundColor : na)