[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 421

 

Buenas tardes, he hecho un bloque para calcular las posiciones abiertas mágicas de compra, pero el problema es que si el bloque funciona en diferentes pares de divisas, entonces el bloque sólo produce resultados para un par de divisas (la última posición abierta). ¿Cómo puedo arreglar el código (sin cambiar la magia) para que el bloque dé el resultado para cada par de divisas?

int OpenMagicOrderCount_buy() 
{
   int OpenBuyOrdersCount = 0;
   int OpenOrders = 0;
   int cnt = 0;
   OpenOrders=OrdersTotal();
   for(cnt=0;cnt<OpenOrders;cnt++)   // scan all orders and positions. ..
   {
     OrderSelect(cnt, SELECT_BY_POS);
          if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
          {                             
                  OpenBuyOrdersCount ++;
          }
   } 
   Print("+++++++++++++++++++++++OpenBuyOrdersCount: " + OpenBuyOrdersCount,"   OrderSymbol()= ", OrderSymbol());
   return(OpenBuyOrdersCount); 
}
 
int OpenMagicOrderCount_buy() 
{
   int OpenBuyOrdersCount = 0;
   int OpenOrders = 0;
   int cnt = 0;
   OpenOrders=OrdersTotal();
   for(cnt=0;cnt<OpenOrders;cnt++)   // scan all orders and positions. ..
   {
     OrderSelect(cnt, SELECT_BY_POS);
          if (OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
          {                             
                  OpenBuyOrdersCount ++;
          }
   } 
   Print("+++++++++++++++++++++++OpenBuyOrdersCount: " + OpenBuyOrdersCount,"   OrderSymbol()= ", OrderSymbol());
   return(OpenBuyOrdersCount); 
}
так все " Los magos"OP_BUY" contarán
 
7777877:

... continúa...

Al final de la subsección StringSubstr Function entre paréntesis se da la siguiente frase: "por separado debemos notar que en el primer bucle for (mi nota: debe ser deinit() ya que no hay otra forma de borrar objetos) no podemos borrar objetos, porque después de cada borrado el número total de objetos y su numeración cambiará y algunos nombres de objetos serán saltados". Pero en el citado EA no hay ningún segundo bucle for . Además, la variable Quant_Del definida en la función deinit() antes del bucle for se inicializa con cero, mientras que la variable i no estaba definida en ninguna parte antes del bucle for.

Resulta que el código anterior omite trivialmente varias líneas del programa.

Así que la primera pregunta es la siguiente: ¿fue realmente una omisión trivial de varias líneas o es un programa tan complicado que un novato no puede entender su significado sin ayuda externa?

Además... En el mismo capítulo de la misma sección, hay un enlace al mismo Asesor Experto (en el archivo adjunto) antes del texto citado que, al hacer clic, abre el mismo Asesor Experto en MetaElitor. Pero el texto de este Asesor Experto es diferente: la función deinit()tiene este aspecto

Entonces, si "combinar" la frase "Por separado, tenga en cuenta que no puede eliminar objetos en el primer bucle for, porque en este caso el número total de objetos y su numeración cambiarán después de cada eliminación, y algunos nombres de objetos se omitirán como resultado" Ytexto función deinit() de la última variante, tengo la segunda pregunta:

Pregunta. ¿Por qué no puedo eliminar objetos en el primer bucle for colocando la función ObjectDelete(Nombre_Objeto) dentro de la sentencia if?

Por qué después de cada borrado "... El número total de objetos cambiará"... Porque en este caso, la variable Quant_Objects, que determina el número total de objetos, adquiere su valor igual a ObjectsTotal(), ¿FORWARD el bucle for?

P.S. Gracias de antemano por la respuesta, para no ensuciar el foro.

Gire el ciclo hacia atrás y borre todo lo que quiera
 
FAQ:
Amplía el bucle hacia atrás y elimina todo lo que puedas

¿Le he entendido bien? Debes pensar en la función deinit (y en el bucle en particular) de la siguiente manera:

int deinit()                           // Спец. функция deinit()
  {
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   for(int k=Quant_Objects; k>=0; k--) // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Если найден объект, …
        {                              // ... начинающийся с Paint_,
         ObjectDelete(Obj_Name);       // … то его и удаляем
        }                              //конец if
     }                                 //конец for
   return;                             // Выход из deinit()
  }                                    //конец deinit
//-------------------------------------------------------------- 10 --
 
Elektronik:


Estos datos son necesarios para calcular la diferencia entre las órdenes de compra y de venta.

supongamos que se abrió una orden de compra con el volumen de 0,09 lotes y dos órdenes de venta con el volumen total de 0,11 lotes, la diferencia entre ellas será 0,09-0,11=-0,02, o si es posible la diferencia entre sus valores.


Pues bien, la función OrderLots.
 
abeiks:

Buenas tardes, he hecho un bloque para calcular las posiciones abiertas mágicas de compra, pero el problema es que si el bloque funciona en diferentes pares de divisas, entonces el bloque sólo produce resultados para un par de divisas (la última posición abierta). ¿Cómo puedo arreglar el código (sin cambiar la magia) para que el bloque calcule para todos los pares de divisas?

Cambios:

if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic &&  OrderType() == OP_BUY )

Para:

if (OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
 
¿Cómo puedo reemplazar el stop loss en pips en el EA, con un stop loss por encima de la última vela?
 
Neo777:
¿Cómo puedo reemplazar el stop loss en pips en el EA, con un stop loss por encima de la última vela?
double x = ... // Задаем на сколько пипсов выше
double sl = NormalizeDouble(High[1] + x * Point, Digits); // Задаем значение стоплосс на x пипсов выше предпоследней свечи
 

Reshetov:спасибо
извиняюсь за то что не в SRC

cómo insertarlo aquí

 
7777877:

¿Le he entendido bien? Debes pensar en la función deinit (y en el bucle en particular) de la siguiente manera:


Correcto, en este caso eliminando por ejemplo el objeto 18, 19 pasa a ocupar su lugar, 19=>18 es decir, se obtiene automáticamente una iteración inversa. Utilícelo también para los pedidos.

Además, como la lista de objetos y órdenes son formalmente arrays que comienzan en = 0, el índice máximo será uno menos que el tamaño del array:

int Quant_Objects=ObjectsTotal()-1;
Razón de la queja: