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

 
Alexandr Nevadovschi:

Estimados programadores, por favor ayuden a un novato en este negocio.

El EA está abriendo órdenes de compra y venta secuencialmente después de un cierto período de tiempo. Quiero que modifique todas las órdenes anteriores (en concreto, que todas las anteriores se cierren con el Take Profit de la última. Es decir, si la última orden de compra y la orden de venta anterior, entonces el stop loss de la orden anterior se establece en el nivel de take profit de la última,

Si la compra anterior compra, entonces su TakeProfit se establecerá en el nivel del último TakeProfit. La cuestión es que cuando llega la toma de beneficios de la última orden, todas las órdenes deben estar cerradas).

Espero haberlo explicado con claridad, aunque es difícil entender cómo debe aplicarse. Gracias de antemano.

Entiendo que podemos pasar por todas las órdenes abiertas y modificarlas, pero ¿cómo podemos saltarnos la última?

Lo más importante en todo esto es entender lo que debe ocurrir.

¿Qué es la "última orden"? ¿Es la última a la hora de abrir? ¿O por el nivel de precios de apertura?

¿Y si consideramos "la última" orden como "COMPRA", pero el precio se va a la mierda? O al revés, ¿la última orden será de VENTA, pero el precio va hacia el norte? Entonces, ¿cuál debería considerarse el último? Esto es lo que tenemos que entender para realizar nuestra idea.

 

Hola. Si no sabes de antemano cuántos elementos habrá en la matriz, ¿cómo declaras la matriz para que ésta aumente con cada nuevo elemento?

Un ejemplo para que quede más claro:

double HighA[]; // ??????????????????

for(int i=0; i<1000; i++)
{
if(A[i]<B[i])
HighA[i]=A[i];
}
Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Nauris Zukas:

Hola. Si no sabes de antemano cuántos elementos habrá en la matriz, ¿cómo declaras la matriz para que ésta aumente con cada nuevo elemento?

Un ejemplo para que quede más claro:

double HighA[]; // ??????????????????

for(int i=0; i<1000; i++)
{
if(A[i]<B[i])
HighA[i]=A[i];
}
Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));

Deberías leer la documentación más a menudo.
ArrayResize - Операции с массивами - Справочник MQL4
ArrayResize - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArrayResize - Операции с массивами - Справочник MQL4
 
Alexey Viktorov:
Deberías leer la documentación más a menudo.

He leído y probado pero me sale un error de "array fuera de rango". En el ejemplo se veía así:

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[i]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Nauris Zukas:

He leído y probado pero me sale un error de "array fuera de rango". En el ejemplo se veía así:

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[i]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));

Cuando la condición A[i] < B[i] no se cumple, el tamaño del array no cambia y el contador del bucle se incrementa. Por eso está fuera de alcance.

Inténtalo de esta manera.

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            int size = ArraySize(HighA);
            ArrayResize(HighA, size+1);
            HighA[size]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Alexey Viktorov:

Cuando la condición A[i] < B[i] no se cumple, el tamaño del array no cambia y el contador del bucle se incrementa. Por eso está fuera de los límites.

Inténtalo de esta manera.

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            int size = ArraySize(HighA);
            ArrayResize(HighA, size+1);
            HighA[size]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));


Gracias. Ahora todo funciona.
 
Nauris Zukas:

He leído y probado pero me sale un error de "array fuera de rango". En el ejemplo se veía así:

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[i]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));

Bueno, eso funcionaría más rápido

  int countHlines=0;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[countHlines-1]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));


// Вариант №2
  int countHlines=-1;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines+1);
            HighA[countHlines]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Vitaly Muzichenko:

Bueno, así funcionará más rápido

  int countHlines=0;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[countHlines-1]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));


// Вариант №2
  int countHlines=-1;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines+1);
            HighA[countHlines]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
Gracias, ya veo. Será más rápido debido a la ArraySize, ¿se ralentiza de alguna manera?
 
Nauris Zukas:
Gracias, ya veo. Será más rápido debido a la ArraySize, ¿se ralentiza de alguna manera?
No es mucho, pero es claro y a prueba de errores.
 
Alexey Viktorov:
No es mucho, pero es claro y a prueba de errores.
Gracias.