¿Qué método se debe utilizar para fijar SL/TP a un valor específico pero no como distancia del precio de apertura?
Intenté usar algunos stops en mi EA. Añadí tu función manage_trades() y esto es lo que obtuve después del último stop activado (posición cerrada):
2017.09.10 09:48:25.706 2017.01.03 17:50:23 failed market buy 0.00 EURUSD [Invalid volume] 2017.09.10 09:48:25.706 2017.01.03 17:50:23 CTrade::OrderSend: market buy 0.00 EURUSD [invalid volume] 2017.09.10 09:48:25.706 2017.01.03 17:50:23 position #2 is already closed, closing object.. 2017.09.10 09:48:25.706 2017.01.03 17:50:23 failed market buy 0.00 EURUSD [Invalid volume] 2017.09.10 09:48:25.706 2017.01.03 17:50:23 CTrade::OrderSend: market buy 0.00 EURUSD [invalid volume] 2017.09.10 09:48:25.707 2017.01.03 17:50:23 position #2 is already closed, closing object.. 2017.09.10 09:48:25.707 2017.01.03 17:50:23 failed market buy 0.00 EURUSD [Invalid volume] 2017.09.10 09:48:25.707 2017.01.03 17:50:23 CTrade::OrderSend: market buy 0.00 EURUSD [invalid volume]
Usando 3 stops, todos ellos virtuales.
Eso es algo sobre el lote. Yo uso lote fijo 0.1. Después del primer cierre el volumen restante 0.06. Despues del ultimo cierre (stop principal sin volumen especificado) obtengo el error de arriba.
Cuando el lote es mayor que está bien. Lo mismo con sus ejemplos de EA.
Intenté usar algunos stops en mi EA. Añadí tu función manage_trades() y esto es lo que obtuve después del último stop activado (posición cerrada):
Usando 3 stops, todos ellos virtuales.
Eso es algo sobre el lote. Yo uso lote fijo 0.1. Después del primer cierre el volumen restante 0.06. Despues del ultimo cierre (stop principal sin volumen especificado) obtengo el error de arriba.
Cuando el lote es mayor que está bien. Lo mismo con sus ejemplos de EA.
Asegúrate de que estás usando la última versión de la librería (la que se adjunta en este artículo). También, si usted puede adjuntar el código fuente de su EA aquí que sería de gran ayuda.
Asegúrese de que está utilizando la última versión de la biblioteca (la que se adjunta en este artículo). También, si usted puede adjuntar el código fuente de su EA aquí que sería de gran ayuda.
Sí, he actualizado todos los archivos con el adjunto a este artículo. Pero no sé si lo has actualizado otra vez.
¿Podrías probar con tu ejemplo stops_ha_ma2 cambiando el MM a lote fijo y cambiando el tamaño del lote a algún valor pequeño?
Sí, he actualizado todos los archivos con el adjunto a este artículo. Pero no se si lo has actualizado otra vez.
¿Podrías probar con tu ejemplo stops_ha_ma2 cambiando el MM a lote fijo y cambiando el tamaño del lote a algún valor pequeño?
¿Podría publicar aquí el código fuente del EA que experimenta el problema? Nuestra conversación es pública, y el error que has publicado es un problema grave para un EA. Me gustaría que otros lectores también aprendieran de esta conversación dándoles la oportunidad de probar tu código.
No está relacionado con mi EA ya que obtuve el mismo error con tu EA. De todos modos, lo he instalado en otra copia del terminal y ahora se ve bien. Ya no hay error. Tal vez había algo mal con mi biblioteca estándar o algo más ...
Gracias.
No está relacionado con mi EA ya que me dio el mismo error con tu EA. De todas formas, lo he instalado en otra copia del terminal y ahora se ve bien. Ya no hay error. Tal vez había algo mal con mi biblioteca estándar o algo más ...
Hola Enrico,
Sólo quería señalar que he encontrado un par de errores en su código. en ExpertAdvisorBase, la función Time es;
datetime CExpertAdvisorBase::Time(const int index=0) { if(index>=0) { double time[]; if(CopyTime(m_symbol_name,m_period,index,1,time)>0) return(time[0]); } return(-1); }
cuando debería ser como abajo. El tipo de tiempo arriba es double en vez de datetime.
datetime CExpertAdvisorBase::Time(const int index=0) { if(index>=0) { datetime time[]; if(CopyTime(m_symbol_name,m_period,index,1,time)>0) return(time[0]); } return(-1); }
Además, la función Evaluar de TimesBase no pasa el valor por defecto;
bool CTimesBase::Evaluate(datetime current) const
Si se cambia a la de abajo, debe ser;
bool CTimesBase::Evaluate(datetime current) const
Al compilar la carpeta Base\Order, los archivos arrojan muchos errores.
Por ejemplo, la función CreateStops en OrderBase, abajo;
void COrderBase::CreateStops(CStops *stops) { if(!CheckPointer(stops)) return; if(stops.Total()>0) { for(int i=0;i<stops.Total();i++) { CStop *stop=stops.At(i); if(CheckPointer(stop)==POINTER_INVALID) continue; m_order_stops.NewOrderStop(GetPointer(this),stop); } } }
Lanza 'operator=' - no se puede aplicar ninguna de las sobrecargas a la llamada a la función OrderBase.mqh
At' - puntero de objeto esperado OrderBase.mqh
El Base\Stop también tiene los mismos problemas de lanzar una serie de errores relacionados con Stops, Tipos etc.
Gracias por tu buen trabajo, Shep
Hola Enrico,
Sólo quería señalar que he encontrado un par de errores en su código. en ExpertAdvisorBase, la función Time es;
cuando debería ser como abajo. El tipo de tiempo arriba es double en vez de datetime.
Hola Enrico,
Además, la función Evaluar de TimesBase no pasa el valor por defecto;
Si se cambia a la de abajo, debería ser;
Gracias por señalarlo. No me había dado cuenta de esto hasta ahora. Actualizaré el código.
Al compilar la carpeta Base\Order, los archivos arrojan muchos errores.
Por ejemplo, la función CreateStops en OrderBase, abajo;
Lanza 'operator=' - no se puede aplicar ninguna de las sobrecargas a la llamada a la función OrderBase.mqh
At' - puntero de objeto esperado OrderBase.mqh
El Base\Stop también tiene los mismos problemas de lanzar una serie de errores relacionados con Stops, Tipos etc.
Gracias por tu buen trabajo, Shep
Sí, soy consciente de ello. Esto sigue siendo debido a las declaraciones hacia adelante. CStop requiere instancias de COrder y COrderStop en sus métodos. Lo mismo también cuando intentas compilar CStop. Todas estas clases que se requieren mutuamente deberían compilarse juntas. Daría errores si cada una se compila por su cuenta. Por ejemplo:
class Object1 { public: Object2 *m_object2; Object1(){} ~Object1(){} }; class Object2 { public: Object1 *m_object1; Object2(){} ~Object2(){} };
Esto no compilará. Tienes que declarar una declaración forward para que el compilador reconozca el miembro de clase m_object2 dentro de la clase object1:
class Object2; class Object1 { public: Object2 *m_object2; Object1(){} ~Object1(){} }; class Object2 { public: Object1 *m_object1; Object2(){} ~Object2(){} };
Esto está bien si Object1 y Object2 están en el mismo archivo. Si están en dos ficheros separados, entonces necesitas hacer una declaración forward para Objeto2 en el fichero de clase de Objeto1, y para Objeto1 en el fichero de clase Objeto 2.Entonces el compilador no devolvería errores si compilas cualquiera de los dos ficheros. Esto es cierto, hasta que añadas métodos a cualquiera de las dos clases.
La versión actual del compilador reconoce las declaraciones forward, pero no los métodos listados de la clase declarada forwardly. Por eso no recibes mensajes de error como "CStop - declaración sin tipo", pero recibes mensajes de error del compilador para los métodos como el que has puesto arriba. El compilador reconoce la clase, pero no los métodos de la clase que ha sido declarada forwardly.

- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Artículo publicado Asesor Experto multiplataforma: Niveles stop:
En este artículo se analiza la implementación de niveles stop en el asesor comercial, la implementación es compatible con las plataformas MetaTrader 4 y MetaTrader 5.
El proceso general de creación de los niveles stop se muestra en la siguiente figura:
Autor: Enrico Lambino