La estrategia ADR es una estrategia de negociación cuantificada basada en la plataforma TradingView, que combina varios indicadores técnicos para determinar tendencias, señales de filtro y establecer un stop-loss. La estrategia utiliza dos medias móviles de indicadores de diferentes ciclos (EMA) para identificar tendencias principales, usa el ancho de onda real medio (ATR) como filtro de volatilidad y establece un stop-loss dinámico en función del riesgo de stop-loss. Además, la estrategia también introduce medidas de control del tiempo de negociación, equilibrio de pérdidas y pérdidas máximas diarias, para controlar estrictamente el riesgo bajista mientras se aprovecha la oportunidad de tendencia.
Intersección de dos líneas equiláteras: la estrategia utiliza dos líneas de EMA de diferentes ciclos para determinar la tendencia. Cuando la EMA corta pasa por la EMA larga, se considera que la tendencia es alta y produce más señales; por el contrario, cuando la EMA corta pasa por la EMA larga, se considera que la tendencia es baja y produce señales de baja.
Filtro de la volatilidad del ADR: Para evitar que se produzcan señales de negociación en entornos de baja volatilidad, la estrategia introduce el indicador ADR como filtro de la volatilidad. Las operaciones solo se permiten cuando el valor del ADR es superior al umbral mínimo preestablecido.
Ventana de tiempo de negociación: esta política permite a los usuarios establecer la hora de inicio y de finalización de las operaciones diarias. Las operaciones se ejecutan solo dentro de la ventana de tiempo especificada. Esto ayuda a evitar momentos de baja o alta volatilidad.
Dinámico stop-loss: La estrategia se basa en el precio máximo y mínimo promedio de la línea N de la línea K más reciente, combinado con la relación de retorno al riesgo predeterminada, y calcula dinámicamente el precio de stop-loss y el precio de stop-loss. Esto asegura que el riesgo de retorno de cada operación sea controlado.
Equilibrio de pérdidas y ganancias: una vez que la posición alcanza un cierto margen de ganancia (el usuario puede establecer la relación de riesgo-rendimiento), la estrategia cambia el punto de stop a un precio de apertura, es decir, el punto de equilibrio de pérdidas y ganancias. Esto ayuda a proteger las ganancias obtenidas.
Límites de pérdidas máximas diarias: Para controlar las pérdidas máximas diarias, la estrategia establece un límite de pérdidas diarias. Una vez que las pérdidas del día alcanzan este límite, la estrategia detiene la negociación hasta el día siguiente.
Caso de cierre de liquidación: independientemente de si la posición toca la línea de stop-loss o stop-loss, la estrategia liquida todas las posiciones a una hora fija de cada día de negociación (por ejemplo, 16:00), evitando el riesgo de la noche a la mañana.
Una fuerte capacidad de seguimiento de tendencias: mediante la intersección de dos líneas uniformes para determinar las tendencias, se pueden capturar eficazmente las principales tendencias del mercado, lo que aumenta las probabilidades de victoria y el potencial de rentabilidad de la estrategia.
Buena adaptabilidad a la volatilidad: la introducción de indicadores ADR como filtros de volatilidad evita que las transacciones sean frecuentes en un entorno de baja volatilidad, reduciendo las pérdidas causadas por señales ineficaces y falsas rupturas.
Estricto control de riesgos: la estrategia establece medidas de control de riesgo desde varias dimensiones, incluyendo el control de pérdidas y pérdidas dinámicas, el equilibrio de ganancias y pérdidas, el límite de pérdidas máximas diarias, etc., lo que controla eficazmente el riesgo de la estrategia hacia abajo y mejora los beneficios después del ajuste de riesgos.
Los parámetros de la estrategia, tales como el ciclo de la línea media, la longitud del ADR, la relación de riesgo-rendimiento, la ventana de tiempo de negociación, etc., se pueden ajustar con flexibilidad según las preferencias de los usuarios y las características del mercado, lo que optimiza el rendimiento de la estrategia.
Alto grado de automatización: la estrategia está basada en la plataforma TradingView, la lógica de negociación se ejecuta completamente automáticamente por el programa, reduciendo la interferencia de las emociones humanas y los juicios subjetivos, lo que favorece el funcionamiento estable y a largo plazo de la estrategia.
Riesgo de optimización de parámetros: aunque los parámetros de la estrategia pueden ajustarse con flexibilidad, si se optimiza en exceso, puede resultar en una sobreajuste y un mal desempeño fuera de la muestra. Por lo tanto, cuando se establecen los parámetros, se requiere una revisión y un análisis adecuados para garantizar la solidez de la estrategia.
Riesgo de eventos inesperados: esta estrategia se basa principalmente en el comercio de indicadores técnicos, y puede ser poco reactiva a algunos eventos fundamentales importantes inesperados, como cambios en las políticas, fluctuaciones significativas en los datos económicos, etc., lo que puede conducir a una mayor retractación.
Riesgo de reversión de tendencia: en los períodos críticos de reversión de tendencia, las señales de cruce bi-equilibrado pueden presentarse con retraso, lo que hace que la estrategia pierda el momento óptimo para colocarse o sufra pérdidas al principio de la reversión de tendencia.
Riesgo de liquidez: A pesar de que la estrategia establece una ventana de tiempo de negociación, si el indicador de la transacción es de mala liquidez, puede enfrentar riesgos de puntos de deslizamiento, retraso de la transacción, etc., que afectan el rendimiento de la estrategia.
Riesgo de falla de indicadores técnicos: la estrategia depende mucho de los indicadores técnicos, y la eficacia de la estrategia puede disminuir si el entorno del mercado cambia significativamente y los indicadores pierden su significado indicativo original.
Introducción de indicadores con más dimensiones: sobre la base de las líneas bilaterales y ADR existentes, se puede considerar la introducción de indicadores técnicos más efectivos, como MACD, RSI, etc., para mejorar la fiabilidad y la solidez de la señal.
Parámetros de optimización dinámica: se puede establecer un conjunto de mecanismos de optimización de parámetros, según diferentes estados del mercado (por ejemplo, tipo de tendencia, tipo de agitación, etc.), los parámetros clave de la estrategia de ajuste dinámico para adaptarse a los cambios del mercado.
Incorpora los factores fundamentales: La consideración adecuada de algunos indicadores fundamentales importantes, como los datos económicos, las tendencias políticas, etc., puede ayudar a la estrategia a comprender mejor las tendencias del mercado y evitar riesgos sistémicos en el momento oportuno.
Mejora de los mecanismos de contención de pérdidas: se puede optimizar aún más la lógica de contención de pérdidas sobre la base de la contención de pérdidas dinámicas existentes, como la introducción de métodos de seguimiento de pérdidas, contención parcial, etc., para proteger mejor las ganancias y controlar el riesgo.
Multiparámetros, multiciclos: ampliar la estrategia a múltiples parámetros y en múltiples ciclos de tiempo para mejorar la adaptabilidad y estabilidad de la estrategia mediante la optimización de inversiones descentralizadas y de ciclos de tiempo.
La estrategia de cruce uniforme de ADR es una estrategia de negociación cuantificada basada en el análisis técnico, que determina las tendencias mediante el cruce uniforme de dos líneas y se filtra por volatilidad con indicadores ADR. La estrategia también establece estrictas medidas de control de riesgos, incluyendo el riesgo de pérdida de pérdidas, equilibrio de ganancias y pérdidas máximas diarias, para controlar el riesgo bajista. Las ventajas de la estrategia se basan en una fuerte capacidad de seguimiento de tendencias, una buena adaptabilidad a la volatilidad, un control estricto de los riesgos, una gran flexibilidad de los parámetros, un alto grado de automatización.
/*backtest start: 2024-02-26 00:00:00 end: 2024-03-27 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Sameh_Hussein //@version=5 strategy('EMA Cross ADR Strategy with Stats', overlay=true) // Adjustable Parameters shortEmaLength = input(10, title='Short EMA Length') longEmaLength = input(50, title='Long EMA Length') adrLength = input(14, title='ADR Length') riskRewardRatio = input(2.0, title='Risk/Reward Ratio') lookbackCandles = input(10, title='Lookback Candles for Stop Loss') startTime = input(0900, title='Start Time') endTime = input(1600, title='End Time') minAdrValue = input(10, title='Minimum ADR Value for Entry') breakEvenProfit = input.float(1.0, title='Break-Even Profit', minval=0.0) breakEvenRR = input.float(1.0, title='Break-Even Risk-Reward Ratio', minval=0.0) dailyLossLimit = input(-2000.0, title='Daily Loss Limit') // Exponential Moving Averages shortEma = ta.ema(close, shortEmaLength) longEma = ta.ema(close, longEmaLength) // Average Daily Range adr = ta.sma(ta.tr, adrLength) // Time Filter Function timeFilter() => true // Entry Conditions with ADR filter longCondition = ta.crossover(shortEma, longEma) and timeFilter() and adr > minAdrValue shortCondition = ta.crossunder(shortEma, longEma) and timeFilter() and adr > minAdrValue // Calculate the average low and average high of the previous 'lookbackCandles' candles averageLow = ta.sma(low, lookbackCandles) averageHigh = ta.sma(high, lookbackCandles) // Risk and Reward Calculation stopLossLong = averageLow takeProfitLong = close + (close - averageLow) * riskRewardRatio stopLossShort = averageHigh takeProfitShort = close - (averageHigh - close) * riskRewardRatio // Entry Control Variables var longEntryAllowed = true var shortEntryAllowed = true // Update entry price on trade execution var float entryPriceLong = na var float entryPriceShort = na if (strategy.position_size > 0) if (strategy.position_size[1] <= 0) entryPriceLong := strategy.opentrades.entry_price(strategy.opentrades - 1) else entryPriceLong := entryPriceLong else entryPriceLong := na if (strategy.position_size < 0) if (strategy.position_size[1] >= 0) entryPriceShort := strategy.opentrades.entry_price(strategy.opentrades - 1) else entryPriceShort := entryPriceShort else entryPriceShort := na // Adjust stop loss to break-even plus the defined profit when the specified risk-reward ratio is reached breakEvenTriggerLong = entryPriceLong + (entryPriceLong - stopLossLong) * breakEvenRR breakEvenTriggerShort = entryPriceShort - (stopLossShort - entryPriceShort) * breakEvenRR if (longEntryAllowed and close >= breakEvenTriggerLong) stopLossLong := entryPriceLong + breakEvenProfit if (shortEntryAllowed and close <= breakEvenTriggerShort) stopLossShort := entryPriceShort - breakEvenProfit // Close all trades at 1600 if (hour == 15 and minute == 59) strategy.close_all(comment='Close at 1600') // Define the daily loss variable and last trade day var float[] dailyLossArray = array.new_float(1, 0.0) var int[] lastTradeDayArray = array.new_int(1, na) // Function to update the daily loss updateDailyLoss() => _dailyLoss = array.get(dailyLossArray, 0) _lastTradeDay = array.get(lastTradeDayArray, 0) if na(_lastTradeDay) or dayofmonth != _lastTradeDay _dailyLoss := 0.0 array.set(lastTradeDayArray, 0, dayofmonth) if not na(strategy.closedtrades.entry_bar_index(strategy.closedtrades - 1)) _dailyLoss += strategy.closedtrades.profit(strategy.closedtrades - 1) array.set(dailyLossArray, 0, _dailyLoss) // Call the function to update the daily loss updateDailyLoss() // Execute Strategy if longCondition and longEntryAllowed strategy.entry('Long', strategy.long) strategy.exit('Take Profit/Stop Loss', 'Long', stop=stopLossLong, limit=takeProfitLong) longEntryAllowed := false if shortCondition and shortEntryAllowed strategy.entry('Short', strategy.short) strategy.exit('Take Profit/Stop Loss', 'Short', stop=stopLossShort, limit=takeProfitShort) shortEntryAllowed := false // Reset entry control variables on position close if strategy.position_size == 0 longEntryAllowed := true shortEntryAllowed := true // // Statistics // winRate = strategy.wintrades / strategy.closedtrades * 100 // totalTrades = strategy.closedtrades // averageProfit = strategy.grossprofit / strategy.wintrades // averageLoss = strategy.grossloss / strategy.losstrades // // Plotting // plot(shortEma, color=color.new(color.red, 0), title='Short EMA') // plot(longEma, color=color.new(color.blue, 0), title='Long EMA') // // Display Table // table statsTable = table.new(position=position.top_right, columns=2, rows=4, bgcolor=color.gray, border_width=1) // table.cell(statsTable, column=0, row=0, text='Win Rate (%)', bgcolor=color.blue) // table.cell(statsTable, column=1, row=0, text=str.tostring(winRate), bgcolor=color.blue) // table.cell(statsTable, column=0, row=1, text='Total Trades', bgcolor=color.blue) // table.cell(statsTable, column=1, row=1, text=str.tostring(totalTrades), bgcolor=color.blue) // table.cell(statsTable, column=0, row=2, text='Average Profit', bgcolor=color.blue) // table.cell(statsTable, column=1, row=2, text=str.tostring(averageProfit), bgcolor=color.blue) // table.cell(statsTable, column=0, row=3, text='Average Loss', bgcolor=color.blue) // table.cell(statsTable, column=1, row=3, text=str.tostring(averageLoss), bgcolor=color.blue)