![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Llamé a mi función DoubleRound con MODE_TICKVALUE (que es 12,50) en lugar de MODE_TICKSIZE (0,25).
Lo arreglé, pero no hizo desaparecer el #130
Aquí hay un registro del error con la línea actualizada de DoubleRound:
para comparar, aquí hay un registro, donde funcionó:
en cualquier caso, parece que funciona más a menudo ahora, definitivamente estamos acercando. :)
en cualquier caso, parece que ahora funciona más a menudo, definitivamente nos estamos acercando. :)
No veo por qué ha fallado la modificación... ¿obtienes un Bid/Ask nuevo entre el OrderSend y el OrderModify?
Todo lo que puedo sugerir ahora es que cuando se obtiene un error 130. . . imprima todo de nuevo, Bid, Ask (usando MarketInfo), OOP, StopLevel, SL que está tratando de establecer, etc, etc.
Llamé a mi función DoubleRound con MODE_TICKVALUE (que es 12,50) en lugar de MODE_TICKSIZE (0,25).
El error de stoploss #130 ya no aparece. Los últimos pasos parecían haber solucionado finalmente el problema.
Voy a publicar otro post después de esto, resumiendo todos los pasos realizados. Así que otros en el foro que luchan contra el error # 130 puede utilizar este hilo como una referencia.
Gracias por su ayuda continua :).
shinobi
Gracias por tu ayuda continua :).
shinobi
La técnica más importante para combatir los errores es el registro excesivo. Haga una salida para todo lo que pueda estar remotamente relacionado con el error. Si define una función de registro que pueda activar y desactivar, podrá conservar el código después de haber resuelto el problema.
Al inicializar su asesor experto debe registrar toda la información que MarketInfo le pueda decir: https://docs.mql4.com/constants/marketinfo
Además, asegúrese siempre de comprobar los valores de retorno de las funciones, por ejemplo, para OrderModify:
ECN Broker requiere que usted haga órdenes separadas para comprar/vender y stoploss/takeprofit. Por lo tanto, usted necesita dividir su código en dos órdenes como esta:
Para las órdenes de venta necesitas reemplazar OP_BUY por OP_SELL. También debe comprobar los valores de retorno de OrderSelect y OrderModify (ver Consejos Generales más arriba).
Algunos Brokers exigen que el stoploss, el takeprofit y el slippage se ajusten a 4/5 dígitos. Puede hacerlo poniendo el siguiente código en su función init() (thx WHRoeder):
Entonces necesitas multiplicar stoploss, takeprofit y slippage con pips2db1 antes de enviarlo al Broker
Otra posible causa es que las tasas de mercado cambiaron entre el tick activado el Asesor Experto (EA), y el EA OrderSend() o OrderModify() fue ejecutado. Para evitar este problema, hay dos posibles soluciones:
La primera es utilizar RefreshRates() antes de utilizar variables de mercado predefinidas como: Ask y Bid. (estas variables obtienen sus valores cuando el tick activa el EA)
La segunda es no utilizar las variables de mercado predefinidas en absoluto. En su lugar puede utilizar los valores actuales del mercado con MarketInfo(). En lugar de Ask, Bid y Point utilice
Si el stoploss o el takeprofit están demasiado cerca del precio de entrada, la orden será rechazada. Para evitar este problema, debe tener en cuenta el spread actual entre Ask y Bid. De nuevo hay dos soluciones:
La primera es calcular el spread y sumarlo/restarlo a su stoploss/takeprofit.
La segunda solución es tener en cuenta implícitamente el spread utilizando el Ask y el Bid, al calcular el stoploss o el takeprofit:
Los corredores tienen un determinado nivel de stop. Si su stoploss está por debajo de ese nivel, su orden será rechazada. Puede comprobar el nivel de stop con MarketInfo(Symbol(), MODE_STOPLEVEL).
Para evitar esto compruebe su stoploss con el nivel de stop del broker y ajústelo si es necesario:
Freeze Level es un concepto similar. Su stoploss también tiene que ser mayor que el nivel de congelación del broker. Puede comprobar el nivel de congelación mediante MarketInfo(Symbol(), MODE_FREEZELEVEL).
Para evitar esto, compruebe de nuevo su stoploss con el nivel de congelación del broker:
Finalmente su stoploss o takeprofit podría ser rechazado, porque el símbolo sólo admite stoploss/takeprofit que coincidan con su ticksize. El ticksize es la distancia mínima que el precio del símbolo puede subir y bajar. Por ejemplo, si el precio es 1000 y el tamaño del ticksize 0,25, entonces el precio sólo puede subir o bajar un múltiplo de 0,25 (0,25 * n, donde n es un número natural). Así que el precio puede subir 0,25 hasta 1000,25 o bajar 1,75 hasta 998,25.
Para tener en cuenta el tamaño de los ticks, se necesita una función que redondee los valores dobles a un determinado valor de paso (por ejemplo, el 0,25 más cercano). Esta es una función de este tipo:
Por ejemplo, si se llama a DoubleRound con number = 1023.81234 y step = 0.25, se obtendrá 1023.75. Llamándola con 1023.967834 devolvería 1024.00
Ahora, antes de enviar el stoploss o el takeprofit, redondea al tamaño de los ticks del símbolo con:
Aquí hay un pequeño ejemplo completo teniendo en cuenta todas las medidas de contador anteriores:
Espero que esto ayude a deshacerse del #130. Si la modificación de tu código no funciona, utiliza primero un ejemplo mínimo, como el de arriba. Y luego, cuando el error desaparezca, retoma lo modificado en tu código.
Buena suerte,
shinobi
Mi agradecimiento a Raptor, WHRoeder, SDC, BigAl, gjol y 35806 por ayudarme a deshacerme del error y a elaborar esta referencia.