Este artículo presenta una estrategia de negociación cuantitativa basada en el principio de cruce de promedios móviles. La estrategia determina la dirección larga / corta comparando el precio con el promedio móvil, y establece niveles de ganancia y stop loss para controlar el riesgo.
El núcleo de esta estrategia es el promedio móvil. Cálcula el promedio móvil simple del precio de cierre durante un cierto período como base para juzgar la tendencia. Cuando el precio cruza por encima del promedio móvil, genera una señal larga, y cuando cruza por debajo, genera una señal corta. La función exrem se utiliza para filtrar señales duplicadas continuas y mejorar la calidad de la señal. La estrategia establece los niveles de toma de ganancias y stop loss correspondientes basados en la dirección de la posición actual y la relación entre el precio y el promedio móvil, controlando el riesgo y el rendimiento de cada operación.
El cruce de promedios móviles es un método de seguimiento de tendencias simple y fácil de usar que puede capturar efectivamente las tendencias del mercado a mediano y largo plazo. Con configuraciones de parámetros razonables, la estrategia puede obtener retornos estables en los mercados de tendencia. La configuración de tomar ganancias y detener pérdidas ayuda a controlar las reducciones y mejorar la relación riesgo-recompensa. La lógica del código de la estrategia es clara, utilizando modularización de funciones, con una fuerte legibilidad y escalabilidad. Además, la estrategia integra la API de la plataforma Dhan para realizar la ejecución de órdenes automatizada, mejorando la eficiencia de la ejecución.
Los promedios móviles son indicadores inherentemente rezagados. Durante los puntos de inflexión del mercado, las señales pueden retrasarse, lo que conduce a oportunidades óptimas de negociación perdidas o señales falsas. La configuración incorrecta de parámetros afectará el rendimiento de la estrategia y debe optimizarse de acuerdo con diferentes características y plazos del mercado.
La estrategia de cruce de promedios móviles es una estrategia de trading cuantitativa simple y práctica que puede obtener ganancias en los mercados de tendencia a través del seguimiento de tendencias y el control de stop loss. Sin embargo, la estrategia en sí tiene ciertas limitaciones y necesita ser optimizada y mejorada de acuerdo con las características del mercado y las preferencias de riesgo. En la aplicación práctica, también es necesario prestar atención a la ejecución de la disciplina estricta y el control adecuado del riesgo.
/*backtest start: 2024-05-01 00:00:00 end: 2024-05-31 23:59:59 period: 1h 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/ // © syam-mohan-vs @ T7 - wwww.t7wealth.com www.t7trade.com //This is an educational code done to describe the fundemantals of pine scritpting language and integration with Indian discount broker Dhan. This strategy is not tested or recommended for live trading. //@version=5 strategy("Pine & Dhan - Moving Average Crossover Strategy", overlay=true) //Remove excess signals exrem(condition1, condition2) => temp = false temp := na(temp[1]) ? false : not temp[1] and condition1 ? true : temp[1] and condition2 ? false : temp[1] ta.change(temp) == true ? true : false // Define MA period ma_period = input(20, title = "MA Length") // Define target and stop loss levels target_percentage = input.float(title="Target Profit (%)", defval=2.0) stop_loss_percentage = input.float(title="Stop Loss (%)", defval=1.0) // Calculate the MA ma = ta.sma(close, ma_period) // Entry conditions long_entry = close >= ma short_entry = close < ma // Calculate target and stop loss prices target_price = long_entry ? strategy.position_avg_price + (close * (target_percentage / 100)) : strategy.position_avg_price - (close * (target_percentage / 100)) stop_loss_price = short_entry ? strategy.position_avg_price + (close * (stop_loss_percentage/ 100)) : strategy.position_avg_price - (close * (stop_loss_percentage / 100)) long_entry := exrem(long_entry,short_entry) short_entry := exrem(short_entry,long_entry) // Plot the MA plot(ma, color=color.blue, linewidth=2, title="MA") // Plot the entry and exit signals plotshape(long_entry, style=shape.arrowup, color=color.green, size=size.small,location = location.belowbar) plotshape(short_entry, style=shape.arrowdown, color=color.red, size=size.small,location = location.abovebar) //Find absolute value of positon size to exit position properly size = math.abs(strategy.position_size) //Replace these four JSON strings with those generated from user Dhan account long_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"B","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"I","sort_order":"1","price":"0"}]}' long_exit_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"S","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}' short_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"S","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}' short_exit_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"B","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}' // Submit orders based on signals if(strategy.position_size == 0) if long_entry strategy.order("Long", strategy.long,alert_message=long_msg) if short_entry strategy.order("Short", strategy.short,alert_message=short_msg) if(strategy.position_size > 0) if(short_entry) strategy.order("Short", strategy.short, qty = size, alert_message=short_msg) else strategy.exit("Long Exit", from_entry="Long", qty = size, stop=stop_loss_price, limit= target_price, alert_message=long_exit_msg) if(strategy.position_size < 0) if(long_entry) strategy.order("Long", strategy.long, qty = size, alert_message=long_msg) else strategy.exit("Short Exit", from_entry="Short", qty = size, stop=stop_loss_price, limit= target_price, alert_message=short_exit_msg)