Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1194

 
vladmirad:

Gracias por el consejo, conozco estas funciones.

Sabes por qué tanta gente, incluido tú, responde a los que conocen mql como un hacha. ¿Y no hacen caso a los consejos de los entendidos? Si no tiene ninguno, puede utilizar este consejo:

El foro sobre el comercio, los sistemas de comercio automatizados y la comprobación de estrategias.

Cualquier pregunta de los principiantes sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos

Artyom Trishkin, 2020.06.29 00:03

Hola.
Empiece por monitorizar el estado del gráfico en OnChartEvent() https://www.mql5.com/ru/docs/event_handlers/onchartevent
Hay algunos eventos que necesita:
CHARTEVENT_OBJECT_CREATE Crear objeto gráfico
CHARTEVENT_OBJECT_CHANGE Cambiar las propiedades del objeto gráfico a través del diálogo de propiedades
CHARTEVENT_OBJECT_DELETE Borrar objeto gráfico
https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents
Registrar todos los parámetros del manejador OnChartEvent() y ver sus valores cuando se añaden/modifican/borran objetos gráficos. Esto te orientará hacia dónde ir.

 
vladmirad:

Gracias por el consejo, conozco estas funciones.
Pero, ¿cómo podemos utilizarlos para encontrar automáticamente un objeto en el gráfico y leer sus parámetros, si no conocemos su nombre a priori?
Al dibujar un objeto en un gráfico con el ratón, el sistema da su nombre.

Por supuesto, no es difícil organizar la introducción manual de todos los datos necesarios del objeto a partir de su tabla de propiedades, pero entonces ¿por qué la automatización?
Pero cómo dar programáticamente a un EA el nombre de un objeto y que luego se puedan utilizar todas las funciones que has mencionado, aún no me queda claro...

Como se ha señalado anteriormente, trabaje con los eventos de los gráficos:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool applyObject(const string _objName) {
  if(MessageBox("Сохранить параметры объекта \"" + _objName + "\" для эксперта?", "ObjChange", MB_YESNO) == IDYES) {
    objName = _objName; // Запись имени изменяемого объекта
    // Запись других параметров изменяемого объекта ...
    return true;
  }
  return false;
}

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam
) {
//---
  if(id == CHARTEVENT_OBJECT_CREATE || id == CHARTEVENT_OBJECT_DRAG || id == CHARTEVENT_OBJECT_CHANGE) {
    applyObject(sparam);
  }
}
Archivos adjuntos:
ObjChange.mq5  5 kb
 
Artyom Trishkin:
Hola.
Comience por rastrear el estado del gráfico en OnChartEvent() https://www.mql5.com/ru/docs/event_handlers/onchartevent
Hay algunos eventos que necesita:
CHARTEVENT_OBJECT_CREATE Crea un objeto gráfico
CHARTEVENT_OBJECT_CHANGE Cambia las propiedades de un objeto gráfico a través del diálogo de propiedades
CHARTEVENT_OBJECT_DELETE Elimina un objeto gráfico
https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents
Registra todos los parámetros de OnChartEvent() y ve sus valores cuando añade/modifica/elimina objetos gráficos. Esto te orientará hacia dónde ir.

Muchas gracias, ya he seguido sus consejos.

 
Mihail Matkovskij:

Puede encontrar y registrar objetos de un tipo determinado con sus coordenadas de la siguiente manera:

Puedes guardar cualquier dato en un archivo. Y en el Asesor Experto, haga un cargador que agregue los objetos apropiados, y luego cargue los datos del archivo en ellos. Pero al menos esboza un código fuente para su tarea específica y lo publica aquí.

Gracias también, Michael, por tu ayuda práctica.
 
Mihail Matkovskij:

Como se ha indicado anteriormente, trabaje con los eventos del gráfico:

Michael, tu ayuda y la de @Artyom Trishkin han sido muy útiles!

Ahora tenemos que averiguar cómo encontrar el punto de cruce entre el gráfico de precios y el objeto encontrado, en este caso, la línea de tendencia.

El algoritmo es el siguiente:
1. Utilizando las coordenadas de lectura de la línea de tendencia, calculamos el coeficiente de aumento de la tendencia por 1 barra del TF seleccionado.
2. Calcula la coordenada del precio de la línea de tendencia en la barra actual y controla el hecho de cruzar por el gráfico este punto durante el TF seleccionado.
3. Si es así, se procede a la tramitación de este evento, por ejemplo, abrir un pedido. Si no, se repite el procedimiento para el siguiente compás.

Pero tal vez MT4(5), debido a las especificidades de este sistema, tiene una solución mucho más simple?

 
Alexey Viktorov:

Sabes por qué tanta gente, incluido tú, responde a los que saben mql como un hacha. Y no hacen caso a los consejos de los que saben. En su caso, se trata de este consejo:


Querido Alexey, tienes toda la razón sobre mis conocimientos de MQL. Sin embargo, te equivocas al decir que no presto atención a los consejos de los insiders, porque mi primer contacto fue con@Artyom Trishkin, que creo que es uno de los profesionales destacados de MQL y al que conoces bien.

Sus consejos me permitieron comprender inmediatamente cómo resolver mi problema y me abrieron los ojos para seguir actuando. Y@Mihail Matkovskij me hizo la vida aún más fácil.

 
vladmirad:

Michael, tu ayuda y la de @Artyom Trishkin han sido muy útiles!

Ahora tenemos que averiguar cómo encontrar el punto de cruce entre el gráfico de precios y el objeto encontrado, en este caso, la línea de tendencia.

El algoritmo es el siguiente:
1. Utilizando las coordenadas de lectura de la línea de tendencia, calculamos el coeficiente de aumento de la tendencia por 1 barra del TF seleccionado.
2. Calcula la coordenada del precio de la línea de tendencia en la barra actual y controla el hecho de cruzar por el gráfico este punto durante el TF seleccionado.
3. Si es así, se procede a la tramitación de este evento, por ejemplo, abrir un pedido. Si no, se repite el procedimiento para el siguiente compás.

Pero tal vez MT4(5), debido a las especificidades de este sistema, tiene una solución mucho más simple?

Como he dicho más arriba, dibuja un código fuente para tener algo con lo que empezar. Además, ya tiene algunos conocimientos sobre cómo obtener los datos del objeto en el gráfico. Nadie quiere hacerlo todo por ti desde cero. Y de esta manera, lo que falta para el trabajo del experto puede ser complementado...

 
vladmirad:

Michael, tu ayuda y la de @Artyom Trishkin han sido muy útiles!

Ahora tenemos que averiguar cómo encontrar el punto de cruce entre el gráfico de precios y el objeto encontrado, en este caso, la línea de tendencia.

El algoritmo es el siguiente:
1. Utilizando las coordenadas de lectura de la línea de tendencia, calculamos el coeficiente de aumento de la tendencia por 1 barra del TF seleccionado.
2. Calcula la coordenada del precio de la línea de tendencia en la barra actual y controla el hecho de cruzar por el gráfico este punto durante el TF seleccionado.
3. Si lo ha hecho, se procede a la tramitación de este evento, por ejemplo, abrir un pedido. Si no, se repite el procedimiento para el siguiente compás.

Quizás, todo es mucho más fácil en MT4(5) debido al carácter específico de este sistema.

No está muy claro lo que quiere encontrar. ¿Quieres encontrar el punto de cruce de la línea de tendencia por el precio en alguna barra? Para ello existen funciones para obtener el valor de la línea en una barra. Pero yo utilizaría la ecuación de la línea recta:

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

FAQ de principiantes MQL5 MT5 MetaTrader 5

Artyom Trishkin, 2020.05.02 12:27

Utiliza una ecuación de la línea recta:

//+------------------------------------------------------------------+
//| Уравнение прямой                                                 |
//+------------------------------------------------------------------+
double EquationDirect(const int left_bar,const double left_price,const int right_bar,const double right_price,const int bar_to_search) 
  {
   return(right_bar==left_bar ? left_price : (right_price-left_price)/(right_bar-left_bar)*(bar_to_search-left_bar)+left_price);
  }
//+------------------------------------------------------------------+

Especifique el número de barra y el precio del punto de la izquierda, especifique el número de barra y el precio del punto de la derecha (se dibuja una línea virtual en estos puntos) y especifique la barra que está buscando.
La función le devolverá el precio del bar que está buscando.


No requiere la presencia de un objeto real.
 
Artyom Trishkin:

..... Existen funciones para obtener el valor de la línea en la barra. Pero yo utilizaría la ecuación de la línea recta:

.....

Artyom, más detalles aquí, por favor.

O no estuve muy atento antes, o la documentación fue retocada... No lo sé.

Pero siempre pensé que ObjectGetDouble devolvía el precio de la línea en una barra concreta (me refiero al precio exactamente). Y aquí decidí hacer un pequeño script para comprobarlo, y ¿qué vi?

1. No hay ningún número de barra en los parámetros, en los que se debe leer el valor.

2. identificador de la propiedad:

OBJPROP_PRICE

Precio coordinado

modificador=número de punto de anclaje


¡es sólo el punto de anclaje!

Sí, básicamente, si trazo esta línea en el código, ¡ya tengo estos puntos! ¿Por qué necesito conocerlos? De hecho, ¿qué sentido tiene?

¿Cómo puedo obtener el valor del precio de esta línea en otro lugar?


Resulta que esto es

prop_modificador

[in] Modificador de la propiedad especificada. Para la primera opción, el valor por defecto del modificador es 0. La mayoría de las propiedades no requieren un modificador. Denota un número de nivel enlas herramientas de Fibonacci y en el objeto gráfico Pitchfork de Andrews. La numeración de los niveles comienza desde cero.

¿No tiene ningún sentido? ¿Busca puntos de fijación de cualquier línea de abanico? Eso es una tontería. Perdón.

Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Все объекты, используемые в техническом анализе, имеют привязку на графиках по координатам цены и времени – трендовая линия, каналы, инструменты Фибоначчи и т.д.  Но есть ряд вспомогательных объектов, предназначенных для улучшения интерфейса, которые имеют привязку к видимой всегда части графика (основное окно графика или подокна индикаторов...
 
Сергей Таболин:

Artyom, ¿podrías entrar en un poco más de detalle aquí, por favor?

O yo no estaba muy atento antes, o la documentación ha sido retocada... No lo sé.

Pero siempre pensé que ObjectGetDouble devolvía el precio de la línea en una barra concreta (me refiero al precio). Y aquí decidí hacer un pequeño script para comprobarlo, y ¿qué vi?

1. No hay ningún número de barra en los parámetros, en los que se debe leer el valor.

2. identificador de la propiedad:

OBJPROP_PRICE

Precio coordinado

modificador=número de punto de anclaje


¡es sólo el punto de anclaje!

Sí, básicamente, si trazo esta línea en el código, ¡ya tengo estos puntos! ¿Por qué necesito conocerlos? De hecho, ¿qué sentido tiene?

¿Cómo puedo obtener el valor del precio de esta línea en otro lugar?


Resulta que esto es

prop_modificador

[in] Modificador de la propiedad especificada. Para la primera opción, el valor por defecto del modificador es 0. La mayoría de las propiedades no requieren un modificador. Denota un número de nivel enlas herramientas de Fibonacci y en el objeto gráfico Pitchfork de Andrews. La numeración de los niveles comienza desde cero.

¿No tiene ningún sentido? ¿Busca los puntos de fijación de cualquier línea de abanico? Eso es una tontería. Perdóname.

No he trabajado mucho con esos objetos. ¿Qué devolverá esta función para la tendencia según el tiempo de barra especificado? No tengo tiempo para comprobarlo. Aunque se trate de un pequeño guión...

ObjectGetValueByTime()

Документация по MQL5: Графические объекты / ObjectGetValueByTime
Документация по MQL5: Графические объекты / ObjectGetValueByTime
  • www.mql5.com
Функция использует синхронный вызов – это означает, что функция дожидается выполнения всех команд, которые были помещены в очередь графика перед её вызовом, и поэтому данная функция может быть затратной по времени. Нужно иметь это обстоятельство в виду...
Razón de la queja: