Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 650

 
AlexeyVik:

Tengo entendido que necesita obtener los parámetros de los objetos de otro gráfico.

Si es de otro gráfico, que utilice la variante de la función con el identificador del gráfico.

tampoco hay problema.

 
sergeev:

Si es de un gráfico diferente, que utilice una variante de la función con un identificador de gráfico.

tampoco hay problema.

Totalmente cierto, pero aún no he necesitado usar un identificador de gráfico y sólo estoy familiarizado teóricamente con él, por eso sugerí la opción de mapear objetos al gráfico actual.
 
rov_kvn:



¡Eso es genial! Esa era exactamente la cuestión. ¡Gracias, querido camarada!
 
sergeev:

Si es de un gráfico diferente, que utilice una variante de la función con un identificador de gráfico.

Tampoco hay problema.


Según entiendo, las únicas opciones son ObjectGetDouble() para el precio y ObjectGetInteger() para la fecha en mi caso.

Intento obtener el precio en el TF actual con chart_id = 0

double price1 = ObjectGetDouble(0,"Supply",3);

- valor como debe ser. He probado con ambos ID y valores de aquí https://docs.mql4.com/ru/constants/chartconstants/enum_timeframes en lugar de 0, pero devuelve 0. ¿Cómo debería ser un chart_id "correcto"?

 
.roman.:

Según entiendo, las únicas opciones son ObjectGetDouble() para el precio y ObjectGetInteger() para la fecha en mi caso.

Estoy tratando de obtener el precio en el TF actual con chart_id = 0

- valor como debe ser. He probado con ambos ID y valores de aquí https://docs.mql4.com/ru/constants/chartconstants/enum_timeframes en lugar de 0, pero devuelve 0. ¿Cómo debería ser un chart_id "correcto"?

chart_id = 0 no es el TF, es el gráfico actual. Es necesario encontrar el chart_id del gráfico que tiene el objeto deseado. Eso es lo que no hice por falta temporal de necesidad.
 
.roman.:

Según entiendo, las únicas opciones son ObjectGetDouble() para el precio y ObjectGetInteger() para la fecha en mi caso.

Intentando obtener el precio en la TF actual con chart_id = 0

double price1 = ObjectGetDouble(0,"Supply",3);


¿Qué es el 3?



- El valor es como debe ser. He probado con ambos ID y valores de aquí https://docs.mql4.com/ru/constants/chartconstants/enum_timeframes en lugar de 0, pero devuelve 0. ¿Cómo debería ser un chart_id "correcto"?

¿Qué tienen que ver los periodos TF con chart_id?


tienes un agujero irreal en tu comprensión de lo que hay que usar


Describe tu problema, no te pongas demasiado oscuro y rodea la tripa.

¿Qué necesito para recuperar los datos de un objeto?

- ObjectGet ¿Por qué no te ha gustado?

 
sergeev:

¿Qué es el 3?


El valor del precio del límite inferior del rectángulo. https://docs.mql4.com/constants/objectconstants/enum_object_property


¿qué tienen que ver los periodos de TF con el ID del gráfico?

No tengo ni idea de cómo. Por eso intento hacerlo yo y preguntar, ya que he fracasado.

sargazo:
describa su tarea, no se oscurezca y ande a tientas. ¿qué necesita exactamente? obtener datos de un objeto? - ObjectGet ¿Qué tiene de malo?

¿Lo preguntas en serio? Ya he escrito 3 veces que necesito obtener los datos de los rectángulos (2 coordenadas de precio y dos coordenadas de tiempo utilizadas para construir los rectángulos) de otros dos timeframes(H4 y D), estando en el tercero(H1).

ObjectGet no es adecuado porque no puede recibir nada de otro marco temporal.

El indicador dibuja rectángulos en todos los timeframes y le he añadido código, transmitirá las coordenadas de los rectángulos de otros timeframes sin cambiar a ellos. No sé cómo explicarlo de otra manera.

 
.roman.:

El valor del precio del límite inferior del rectángulo. https://docs.mql4.com/constants/objectconstants/enum_object_property



No tengo ni idea de cómo. Por eso estoy intentando hacerlo por intuición y preguntando, porque no ha funcionado.

¿Lo preguntas en serio? Ya he escrito 3 veces que necesito obtener los datos del rectángulo (2 coordenadas de precio y dos coordenadas de tiempo para construir los rectángulos) de otros dos timeframes(H4 y D), estando en el tercero(H1).

ObjectGet no es adecuado porque no puedo obtener nada de otro marco temporal con él.

Dibuja rectángulos en todos los timeframes y le estoy añadiendo un código por el que pasará las coordenadas de los rectángulos de otros timeframes sin cambiar a ellos, no sé explicarlo de otra manera.

Sólo hay que entender que otro marco temporal y otro gráfico o cuadro son conceptos diferentes y, por lo tanto, enfoques diferentes para resolver los problemas.
 
AlexeyVik:
Comprender que una TF diferente y un gráfico o carta diferente son conceptos diferentes y, por tanto, enfoques diferentes para resolver problemas.

Por lo tanto, sólo estoy feliz de entender y aceptar cualquier solución, si tengo ideas. Por eso pido consejo sobre cómo aplicarlo.
 
Top2n:

Gracias. Entendido. Excepto que con el error de OrderSelect, no está claro cómo parar excepto paracontinuar.

Borrado el mensaje de última hora, hizo casi lo mismo que se describe.

A veces se puede combinar el valor de retorno y el signo de error. Cuando tiene sentido tomar algún valor como señal de error. Por ejemplo, un precio medio igual a 0.

Entonces, tan pronto como OrderSelect() devuelve un signo de error, nuestra función devuelve un signo de error a la vez:

#property strict

/******************************************************************************/
double CenaUsrednenija(const int type,const int Magic){
  double nn = 0, bb = 0;

  for(int i = OrdersTotal() - 1; i >= 0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
      if(OrderSymbol() == Symbol() && OrderType() == type && OrderMagicNumber() == Magic)
      {
        double op = OrderOpenPrice();
        double llot = OrderLots();

        bb += op * llot;
        nn += llot;
        Print("  type = ", type, " Цена открытия = ", op, " Лот = ", llot, " itog = op * llot = ", op * llot, " factb = bb / nn = ", bb / nn);
      }
    } else {
      return 0; // Цена == 0 - признак ошибки (OrderSelect() не смогла выбрать ордер)
    }
  }

  return nn != 0 ? NormalizeDouble(bb / nn, _Digits) : 0; // Делить на 0 не следует
}

/******************************************************************************/
void OnStart() {
  Print("CenaUsrednenija(OP_BUY, 536525) = ", CenaUsrednenija(OP_BUY, 536525));
}

Hazlo por mi cuenta, lo tengo:

23:32:03 Script 1 EURUSD,H1: loaded successfully
23:32:03 1 EURUSD,H1: initialized
23:32:03 1 EURUSD,H1:   type = 0 Цена открытия = 1.36626 Лот = 0.1 itog = op * llot = 0.136626 factb = bb / nn = 1.36626
23:32:03 1 EURUSD,H1:   type = 0 Цена открытия = 1.36931 Лот = 0.1 itog = op * llot = 0.136931 factb = bb / nn = 1.367785
23:32:03 1 EURUSD,H1: CenaUsrednenija(OP_BUY, 536525) = 1.36779
23:32:03 1 EURUSD,H1: uninit reason 0
23:32:03 Script 1 EURUSD,H1: removed

Parece que es cierto...

Sí, no he utilizado una expresión condicional en Print() para evitar la hipotética división por 0 porque este Print() es de depuración...