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

 
Maxim Kuznetsov:

¿Qué canon es ese? Hay un documento oficial - es exactamente como el tuyo... todo lo demás es falso.

1. vale la pena establecer la serialización de todas las matrices utilizadas dentro de OnCalculate

2. Antes de entrar en el bucle, pon buff[length]=Bid+size; - obtendrás aproximadamente lo que quieres. Una línea curva y al final una "visera" en Bid+size

3. Vigilar los límites de la matriz. Por supuesto, rates_total < length, pero no se puede bromear con ello :-)

En otras palabras, debes escribir ArraySetAsSeries al principio y luego bailar desde allí?

Oh sí, lo he descrito mal. Necesita esta línea para ir a la izquierda en el gráfico y actualizarla con cada tick

 
YanSay:

Muchas gracias por su detallada respuesta.

Siguiendo tus consejos he dividido las ramas y todo ha funcionado.

Me enfrenté a un problema con la apertura simultánea de 10-15 órdenes pendientes, resolví el problema añadiendo su código después:

Esto tampoco es una solución. La orden puede ser abierta manualmente o por otro EA. Como resultado, la EA que se está desarrollando no abrirá nada. Por lo tanto, necesitamos contar el número de órdenes abiertas por el Asesor Experto. Con estos datos, decide si abre o no un pedido.

Estoy seguro de que hay una forma mejor.

Con respecto a su código, por favor explique lo que 1; i >=0; --i?

Este es el bucle de pedido estándar. OrdersTotal() es el número de pedidos. Los pedidos se indexan empezando por cero. Así, si hay 1 pedido, su índice será 0, mientras que OrdersTotal() devolverá 1. Por lo tanto, el bucle debe comenzar con el índice que es 1 menos que el número de pedidos. Obtenemos OrdersTotal() - 1. El segundo operando es la condición de ejecución del cuerpo del bucle. En este caso, el bucle terminará en i = -1. El tercer operando es la ejecución del salto del bucle al siguiente índice (disminución en 1).

Puedes leer sobre el operador de bucle en la documentación.

 
Ihor Herasko:

Esto tampoco es una opción. La orden puede ser abierta manualmente o por otro EA. Como resultado, la EA que se está desarrollando no abrirá nada. Por lo tanto, necesitamos contar el número de órdenes abiertas por el Asesor Experto. Teniendo estos datos, tendremos que tomar la decisión de abrir o no una orden.

Lo probé así pero empezó a abrir 10-15 órdenes por 1 señal de nuevo:

if ((OrdersTotal ()>0) && (OrderMagicNumber() != 100)) return;

El tercer operando es para pasar al siguiente índice (disminuir en 1).

¿Así que está mirando todos los pedidos desde el final?

 
YanSay:

Lo intenté, pero empezó a abrir 10-15 órdenes para 1 señal de nuevo:

¿Así que está mirando todos los pedidos desde el final?

Para utilizar la función OrderMagicNumber(), primero debe seleccionar un pedido. El bucle estándar de recogida de información sobre los propios pedidos tiene este aspecto (por ejemplo, contar el número de pedidos):

int nCnt = 0;    // Счетчик количества своих ордеров
for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;

      if (OrderSymbol() != Symbol())
         continue;

      if (OrderMagicNumber() != <значение ID ордеров эксперта>)
         continue;

      ++nCnt;
   }

Después de ejecutar este código, la variable nCnt contendrá el número de órdenes de trabajo del Asesor Experto.

 
Ihor Herasko:

Resuelvo el problema de la siguiente manera...


Gracias.

 
Ihor Herasko:

Para utilizar la función OrderMagicNumber(), primero debe seleccionar un pedido. El ciclo estándar de recopilación de información sobre los propios pedidos es el siguiente (por ejemplo, contar el número de pedidos):

Después de ejecutar este código, la variable nCnt contendrá el número de órdenes de trabajo del EA.

int nCnt = 0;    // Счетчик количества своих ордеров
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber)
     continue;
  ++nCnt;
  {
   if (nCnt>0)
      return;
  }
 }

¡Muchas gracias! ¡Funcionó!

¿Podría indicar si ++nCnt es la sustitución del número de pedidos obtenido en la propia variable nCnt?

 
YanSay:

¡Muchas gracias! Ha funcionado.

¿Puedes decirme si ++nCnt está sustituyendo el número de pedidos recibidos en la propia variable nCnt?

En todos estos casos, consulte la documentación de inmediato. ))

 
YanSay:

¡Muchas gracias! Ha funcionado.

¿Puede decirme si ++nCnt es la sustitución del número de pedidos recibidos en la propia variable nCnt?

Hay una documentación completa del lenguaje, basta con echar un vistazo al menú superior del sitio.

No te dé pereza leerlo, es imposible tenerlo todo en la cabeza, casi todo el mundo, no sólo los principiantes, lo consiguen siempre.

Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
  • www.mql5.com
Операция инкремента и декремента применяются только к переменным, к константам не применяются. Префиксныe инкремент (++i) и декремент (--k) применяются к переменной непосредственно перед использованием этой переменной в выражении. Могут возникнуть вычислительные проблемы при переносе вышеуказанного выражения из одной среды программирования в...
 
Artyom Trishkin:

Hay una documentación completa sobre el idioma, basta con echar un vistazo al menú superior del sitio web.

No tengas pereza de leerlo, no puedes guardarlo todo en tu cabeza, siempre está ahí para casi todos, no sólo para los novatos.

Gracias. No siempre sé en qué sección buscar, todavía no soy muy bueno y el editor de F1 no siempre me envía al lugar correcto)

Intentaré no molestar con preguntas estúpidas, gracias por su paciencia)

 
Roman Sharanov:

1. ¿Te refieres a escribir ArraySetAsSeries en el principio y luego ir desde allí?

Oh sí, lo describí mal. Quieres que esta línea vaya hacia la izquierda en el gráfico y se actualice con cada tick

Así que dibuja una línea horizontal.

¿Por qué se necesitan topes y su recálculo? ObjectSetDoubke(0,myHLine,OBJPROP_PRICE,concrete_price_value);

el usuario verá la línea, no perderá tiempo recalculando los buffers, todo el mundo está contento y se dispersa felizmente

P.D.: el búfer del indicador sirve para transferir (compartir) los resultados de los cálculos realizados en primer lugar. Trazar una línea horizontal de longitud N es diferente

Razón de la queja: