
La estrategia de ADR es una estrategia de comercio cuantitativa basada en la plataforma TradingView, que combina varios indicadores técnicos para juzgar la tendencia, filtrar las señales y establecer paradas. La estrategia utiliza dos promedios móviles indicativos de dos períodos diferentes (EMA) para identificar las principales tendencias, utiliza el promedio real de la amplitud de onda (ATR) como filtro de volatilidad y establece paradas de pérdidas en función de la dinámica de la comparación de la rentabilidad del riesgo.
La estrategia utiliza dos líneas de EMA de diferentes períodos para determinar la tendencia. Cuando el EMA a corto plazo atraviesa el EMA a largo plazo, se considera que la tendencia es hacia arriba y produce una señal de brecha. Por el contrario, cuando el EMA a corto plazo atraviesa el EMA a largo plazo, se considera que la tendencia es hacia abajo y produce una señal de brecha.
Filtración de la tasa de fluctuación ADR: Para evitar que se produzcan señales de negociación en un entorno de baja volatilidad, la estrategia introduce el indicador ADR como filtro de la tasa de fluctuación. Se permite abrir una posición solo cuando el valor de ADR es superior al mínimo mínimo predeterminado.
Ventana de horario: Esta estrategia permite al usuario establecer el horario de inicio y finalización de las operaciones diarias. Las operaciones se ejecutan solo dentro de la ventana de horario indicada. Esto ayuda a evitar períodos de baja liquidez o mayor volatilidad.
Detención de pérdidas y pérdidas dinámicas: la estrategia se basa en la media de los precios máximos y mínimos de las líneas N y K más recientes, y se combina con la proporción de riesgo de retorno predeterminada, para calcular dinámicamente el precio de parada y el precio de pérdida. Esto asegura que el riesgo de retorno de cada operación sea controlado.
Equilibrio de pérdidas y pérdidas: cuando la posición alcanza un cierto margen de ganancias (el usuario puede configurar el porcentaje de retorno por riesgo), la estrategia traslada el punto de parada al precio de apertura de la posición, es decir, el punto de equilibrio de pérdidas y pérdidas. Esto ayuda a proteger las ganancias obtenidas.
Limitación 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 ese límite, la estrategia detendrá la negociación hasta el día siguiente.
Cierre de posiciones: la estrategia elimina todas las posiciones a una hora fija (por ejemplo, 16:00) de cada día de negociación, independientemente de si la posición alcanza o no la línea de stop loss o stop loss, para evitar el riesgo de la noche a la mañana.
La capacidad de seguimiento de tendencias es fuerte: se puede juzgar la tendencia a través de la intersección de dos líneas equiláteras para capturar eficazmente las principales tendencias del mercado, lo que mejora la ganancia de la estrategia y el potencial de ganancias.
Adaptabilidad a la volatilidad: la introducción de los indicadores ADR como filtros de volatilidad evita el comercio frecuente en entornos de baja volatilidad y reduce las pérdidas de señales no válidas y falsas brechas.
Estricto control de riesgos: la estrategia establece medidas de control de riesgos en varias dimensiones, incluidos el stop loss dinámico, el equilibrio de pérdidas y pérdidas máximas diarias, entre otros, lo que controla eficazmente el riesgo a la baja de la estrategia y mejora los beneficios ajustados al riesgo.
Parámetros flexibles: los parámetros de la estrategia, como el ciclo de la media, la duración del ADR, el índice de riesgo-recompensa, la ventana de tiempo de negociación, etc., se pueden configurar de manera flexible según las preferencias del usuario y las características del mercado, para optimizar 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 el juicio subjetivo, lo que favorece el funcionamiento estable de la estrategia a largo plazo.
Riesgo de optimización de parámetros: aunque los parámetros de la estrategia se pueden ajustar con flexibilidad, si se optimiza en exceso, puede ocasionar una sobreadaptación y un mal rendimiento en la muestra externa. Por lo tanto, se necesita una adecuada retroalimentación y análisis al configurar los parámetros para garantizar la solidez de la estrategia.
Riesgo de eventos inesperados: La estrategia se basa principalmente en el comercio de indicadores técnicos, y puede tener una respuesta insuficiente a algunos eventos fundamentales inesperados, como cambios en la política, grandes fluctuaciones en los datos económicos, etc., lo que puede conducir a un gran retroceso.
Riesgo de reversión de la tendencia: la señal de cruce de línea recta puede ser retrasada durante los períodos cruciales de la reversión de la tendencia, lo que hace que la estrategia pierda el mejor momento para establecer una posición o sufra pérdidas durante el inicio de la reversión de la tendencia.
Riesgo de liquidez: A pesar de que la estrategia establece una ventana de tiempo de negociación, si la liquidez de los indicadores de la operación es pobre, es posible que se enfrente a riesgos como puntos de deslizamiento, retrasos en la negociación, que afectan el rendimiento de la estrategia.
Riesgo de fracaso de los indicadores técnicos: la estrategia depende en gran medida de los indicadores técnicos, y la eficacia de la estrategia puede disminuir si ocurren cambios importantes en el entorno del mercado que causan que los indicadores pierdan su significado indicativo original.
Introducción de indicadores de más dimensiones: Sobre la base de la línea de doble promedio y ADR existentes, se puede considerar la introducción de más indicadores técnicos efectivos, como MACD, RSI, etc., para mejorar la fiabilidad y solidez de la señal.
Parámetros de optimización dinámica: se puede establecer un mecanismo para optimizar un conjunto de parámetros, de acuerdo con diferentes estados de mercado (por ejemplo, tipo de tendencia, tipo de convulsión, etc.), los parámetros clave de la estrategia de ajuste dinámico para adaptarse a los cambios en el mercado.
Incorporación de factores fundamentales: La consideración adecuada de algunos indicadores fundamentales importantes, como datos económicos, tendencias políticas, etc., puede ayudar a la estrategia a comprender mejor las tendencias del mercado y evitar los riesgos sistémicos a tiempo.
Mejora de los mecanismos de parada de pérdidas: Sobre la base de la parada de pérdidas dinámicas existentes, se puede optimizar aún más la lógica de la parada de pérdidas, como la introducción de métodos de seguimiento de pérdidas, parada parcial, etc., para proteger mejor los beneficios y controlar el riesgo.
Múltiples objetivos y períodos de tiempo: Extensión de la estrategia a varios objetivos y períodos de tiempo para mejorar la adaptabilidad y la estabilidad de la estrategia mediante la diversificación de la inversión y la optimización de los períodos de tiempo.
La estrategia de ADR para el cruce de líneas uniformes es una estrategia de negociación cuantitativa basada en el análisis técnico, que determina la tendencia a través de cruces de líneas uniformes dobles y filtra la volatilidad con indicadores ADR. La estrategia también establece medidas de control de riesgo estrictas, que incluyen stop loss dinámico, equilibrio de pérdidas, límite de pérdidas máximas diarias, etc., para controlar el riesgo descendente. Las ventajas de la estrategia son su fuerte capacidad de seguimiento de la tendencia, su buena adaptabilidad a la volatilidad, su control de riesgo estricto, su flexibilidad de ajuste de parámetros y su alta 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)