Por casualidad, estoy compartiendo estrategia de Forex rentable de código abierto. Por casualidad, porque este fue destinado a ser un material puramente educativo. Hace unos días TradingView lanzó una característica muy poderosa de valores dinámicos de PineScript que ahora se permite pasar en Alertas. Y gracias a TradingConnector, podrían ejecutarse instantáneamente en la plataforma MT4 o MT5 de cualquier corredor del mundo. Así que sí - TradingConnector también funciona con índices y productos básicos.
La lógica de esta estrategia EURUSD 6h es muy simple - se basa en cruces estocásticos con stop-loss establecido bajo el punto de pivote más reciente. Establecer stop-loss con precisión quirúrgica es posible exactamente gracias a la admisión de valores dinámicos en las alertas. TradingConnector también se ha actualizado para aprovechar estos valores dinámicos y ahora permite ejecutar operaciones con stop-loss, take-profit, así como órdenes de stop y limit.
Otra característica nueva de TradingConnector, es el cierre de posiciones sólo parcialmente - siempre que el corredor lo permita, por supuesto. Una posición necesita tener trade_id especificado en la entrada, se refiere en alertas adicionales con cierre parcial. Las especificaciones detalladas de la sintaxis de alertas y funcionalidades se pueden encontrar en el sitio web de TradingConnector.
La estrategia también tiene en cuenta la comisión.
El deslizamiento se deja intencionalmente en 0. Debido a que el tiempo de entrega de TradingConnector es menor a 1 segundo, el deslizamiento es prácticamente inexistente. Esto se puede lograr especialmente si está utilizando un servidor VPS, alojado en el mismo centro de datos que los servidores de sus corredores. Estoy usando tal configuración, es factible.
Esta estrategia es NO-REPAINTING y NO utiliza TRAILING-STOP o cualquier otra característica conocida por ser defectuosa en el backtester TradingView. ¿Hace que esta estrategia sea a prueba de balas y 100% garantizada de éxito?
Para convertir este guión en estudio para que las alertas puedan ser producidas, hacer 2 cosas:
Este guión fue creado para propósitos educativos solamente.
Ciertamente no se trata de un consejo financiero. Cualquiera que utilice este script o cualquiera de sus partes de alguna manera, debe ser consciente de los altos riesgos asociados con el comercio.
Gracias @LucF y @a.tesla2018 por ayudarme con las correcciones de código :)
Prueba posterior
/*backtest start: 2022-04-23 00:00:00 end: 2022-05-22 23:59:00 period: 15m basePeriod: 5m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Peter_O //@version=5 strategy(title='TradingView Alerts to MT4 MT5 Strategy example', commission_type=strategy.commission.cash_per_order, commission_value=0.00003, overlay=false, default_qty_value=100000, initial_capital=1000) //study(title="TradingView Alerts to MT4 MT5 Strategy example") //uncomment this line and comment previous one to make it a study producing alerts // // This script was created for educational purposes only. // It is showing how to use dynamic variables in TradingView alerts. // And how to execute them in Forex, indices and commodities markets TakeProfitDistance = input(400) TakePartialProfitDistance = input(150) // **** Entries logic **** { periodK = input.int(13, title='K', minval=1) periodD = input.int(3, title='D', minval=1) smoothK = input.int(4, title='Smooth', minval=1) k = ta.sma(ta.stoch(close, high, low, periodK), smoothK) d = ta.sma(k, periodD) plot(k, title='%K', color=color.new(color.blue, 0)) plot(d, title='%D', color=color.new(color.orange, 0)) h0 = hline(80) h1 = hline(20) fill(h0, h1, color=color.new(color.purple, 75)) GoLong = ta.crossover(k, d) and k < 80 GoShort = ta.crossunder(k, d) and k > 20 // } End of entries logic // **** Pivot-points and stop-loss logic **** { piv_high = ta.pivothigh(high, 1, 1) piv_low = ta.pivotlow(low, 1, 1) var float stoploss_long = low var float stoploss_short = high pl = ta.valuewhen(piv_low, piv_low, 0) ph = ta.valuewhen(piv_high, piv_high, 0) if GoLong stoploss_long := low < pl ? low : pl stoploss_long if GoShort stoploss_short := high > ph ? high : ph stoploss_short // } End of Pivot-points and stop-loss logic strategy.entry('Long', strategy.long, when=GoLong) strategy.exit('XPartLong', from_entry='Long', qty_percent=50, profit=TakePartialProfitDistance) strategy.exit('XLong', from_entry='Long', stop=stoploss_long, profit=TakeProfitDistance) strategy.entry('Short', strategy.short, when=GoShort) strategy.exit('XPartShort', from_entry='Short', qty_percent=50, profit=TakePartialProfitDistance) strategy.exit('XShort', from_entry='Short', stop=stoploss_short, profit=TakeProfitDistance) if GoLong alertsyntax_golong = 'long slprice=' + str.tostring(stoploss_long) + ' tp1=' + str.tostring(TakePartialProfitDistance) + ' part1=0.5 tp=' + str.tostring(TakeProfitDistance) alert(message=alertsyntax_golong, freq=alert.freq_once_per_bar_close) if GoShort alertsyntax_goshort = 'short slprice=' + str.tostring(stoploss_short) + ' tp1=' + str.tostring(TakePartialProfitDistance) + ' part1=0.5 tp=' + str.tostring(TakeProfitDistance) alert(message=alertsyntax_goshort, freq=alert.freq_once_per_bar_close) if GoLong strategy.entry("Enter Long", strategy.long) else if GoShort strategy.entry("Enter Short", strategy.short)