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

 
MakarFX #:

Si no te gusta el "-1", puedes hacer esto.

No, no se puede - el programa se bloqueará si se accede a la matriz de esa manera.

En el mejor de los casos, si accede a sus matrices internas, perderá los datos que necesita, o simplemente no los alcanzará en el bucle.

 
Nikolay Ivanov #:

Básicamente es simple, su único resume todas las órdenes desiguales entre los diferentes magos...

Por ejemplo, hay 3 órdenes

La primera iteración de magic=1 unique=0, al final de la iteración unique será=2.

La segunda iteración magik=2unique=2, al final de la iteraciónunique será=3

Como 3>=número de todos los pedidos, el bucle while se romperá... Y la magia =3 nunca se comprobó... Así que magia =2 de nuevo y así con todo...

El primer orden se da mágico =1 por defecto. Entonces el bucle entra en acción:

Inicio de la iteración magic = 1 unique = 0, al final (cuando ya hay una orden con magic = 1) magic = 1 sigue siendo 1 y unique = 0
Segunda iteración magic = 2 unique = 0, al final magic = 2 y unique = 1 (no hay coincidencia) y la retorn se da a la segunda orden magic = 2.
La tercera debería ser igual...

Quería imprimir todo el proceso, pero algo salió mal:

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique)
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}

-----------------------------------

'endless cycle.mq4'     endless cycle.mq4       1       1
'}' - semicolon expected        endless cycle.mq4       49      7
'else' - 'while' expected       endless cycle.mq4       50      5
'else' - illegal 'else' without matching 'if'   endless cycle.mq4       50      5
'OnTick' - function declarations are allowed on global, namespace or class scope only   endless cycle.mq4       60      6
'OnTick' - function already defined and has body        endless cycle.mq4       60      6
   see previous declaration of function 'OnTick'        endless cycle.mq4       60      6
'}' - unexpected end of program endless cycle.mq4       63      1
6 errors, 0 warnings            7       1
 
Nerd Trader #:

En el primer orden se da por defecto magic = 1. Entonces se inicia un bucle:

Inicio de la iteración magic = 1 unique = 0, al final (cuando ya hay una orden con magic = 1 ) magic sigue siendo 1 y unique = 0
Segunda iteración magic = 2 unique = 0, al final, magic = 2 y unique = 1 (no hay coincidencia) y la retorn se asigna a la segunda orden magic = 2.
La tercera debería ser igual...

Quería imprimir todo el proceso, pero algo salió mal:

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique); // <---
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}


 
Artyom Trishkin #:

Aspirar amás: TODOS los lenguajes de programación.

Es sencillo: en los lenguajes de programación, la cuenta empieza en cero. La primera celda de un array tendrá un índice 0. Por lo tanto, hay que hacer un bucle inverso ANTES del cero INCLUYÉNDOLO. Es decir, >=0

OrdersTotal() da como resultado, por ejemplo, 10. Y empiezas un bucle desde 10, mientras que el último índice del array es 9 (¿recuerdas que empezamos desde cero?). ¿Y qué ocurrirá cuando se acceda a una celda de un array inexistente? Así es - el programa se bloqueará por un error crítico, porque has entrado en una zona de memoria no asignada, más allá de los límites del array.

Son muletas sólidas sin duda. Lee, aprende y todo llegará a ti.

Gracias. No es eso lo que quería decir. Se le podría perdonar cualquier cosa a mql si tuviera una licencia abierta. Si no, me estoy metiendo contigo. Bueno, me parece que, por ejemplo, podríamos haber puesto una bandera en la función NormalizeDouble y utilizar el recorte de lugar o el redondeo aritmético. O, por ejemplo, podríamos ampliar las funciones de manejo de posiciones, por ejemplo, devolver el número de posiciones abiertas sólo para vender o comprar. Además, se podría escribir una ayuda más detallada. Pero esto es sólo la opinión de un aficionado. Además, le ruego que me perdone si la declaración anterior ha parecido dura.
 

Hay toneladas de cursos gratuitos y buenos sobre C/C++.

Mql está cerca de ellos y puedes aprender libremente. Afortunadamente, no se necesitan conocimientos profundos. Pero al menos la sintaxis del lenguaje y los fundamentos básicos de los algoritmos.

De lo contrario se producen tonterías en el tema, en lugar de consultas sobre la plataforma y los algoritmos, diálogos a nivel de escuelas primarias - dónde poner ; qué es un bucle y por qué los índices son 0.

Por ejemplo, hay un sitio intuit.ru - hay cursos sobre C y algoritmos, tómate tu tiempo, un par de semanas como máximo. Al mismo tiempo puedes conseguir un papel :-)

 
Maxim Kuznetsov la sintaxis del lenguaje y los fundamentos básicos de los algoritmos.

De lo contrario se producen tonterías en el tema, en lugar de consultas sobre la plataforma y los algoritmos, diálogos a nivel de escuelas primarias - dónde poner ; qué es un bucle y por qué los índices son 0.

Por ejemplo, hay un sitio intuit.ru - hay cursos sobre C y algoritmos, tómate tu tiempo, un par de semanas como máximo. Es posible que te den un papel al mismo tiempo:-)

¿Así?


 
Artyom Trishkin #:

OrdersTotal() da por ejemplo 10. Y empiezas el bucle desde 10. Y el último índice del array es 9 (¿recuerdas que estamos contando desde cero?). ¿Y qué ocurrirá cuando se acceda a una celda de un array inexistente? Correcto - el programa se bloqueará por un error crítico, porque ha entrado en una zona de memoria no asignada, más allá de los límites del array.

Me corrijo... No habrá un error crítico, sólo el booleano OrderSelect devolverá false... y eso es todo... Pero, por supuesto, es mejor evitarlo... Porque si se utilizan características de código incorrectas, es difícil predecir posibles errores...


Nerd Trader#:

En el primer orden se da por defecto magic = 1. Entonces se inicia un bucle:

Inicio de la iteración magic = 1 unique = 0, al final (cuando ya hay una orden con magic = 1 ) magic = 1 y unique = 0
Segunda iteración magic = 2 unique = 0, al final magic = 2 y unique = 1 (no hay coincidencia) y el retorn se asigna a la segunda orden magic = 2.
La tercera debería ser igual...

Sólo veo que el relleno de únicos va muy rápido y llega al límite, y la magia apenas crece... En general, era un error utilizar la misma variable tanto para el control del bucle como para la lógica dentro del bucle donde esta variable se infla...

Imprimir para encontrar una solución en este contexto, pero yo sugeriría simplemente reformular el problema... Por ejemplo encontrar el máximo magik en las órdenes por el bucle y devolverlo con +1, esa sería la solución simple correcta.

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2021.10.19
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 

Se puede hacer de esta manera, el código se llama según sea necesario, por lo que su peso no es un problema

Para la prueba utilicé el sistema de compra/venta

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  Print(GetMagic());
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int GetMagic()
{
//Если должен быть открыт стопордер и если есть уже открытые или отложенные
//ордера, то возможно некоторые с маджиком, это надо проверить и сгенерировать
//для нашего ордера уникальный маджик
  int arr[];
  int n=-1;
  int OT=OrdersTotal();
  for(int i=0; i<OT; i++) {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
      if(OrderType() == OP_SELL || OrderType() == OP_BUY) {
        if(ArraySearchInt(arr, OrderMagicNumber())==-1) {
          n++;
          ArrayResize(arr,n+1);
          arr[n]=OrderMagicNumber();
        }
      }
    }
  }
  ArraySort(arr);
  OT=ArraySize(arr);
  for(int i=0; i<OT; i++)
    if(arr[i]!=i) return i;
  return OT;
}
//-- удаляет копии с массива
int ArraySearchInt(int& m[], int e)
{
  for(int i=0; i<ArraySize(m); i++) {
    if(m[i]==e) return(i);
  }
  return(-1);
}
 

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

Cualquier pregunta de los novatos sobre MQL4 y MQL5, consejos y discusión sobre algoritmos y códigos

Vitaly Muzichenko, 2021.10.19 23:08

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique); // <---
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}


Semyon Semyonych.
Nikolay Ivanov #:

Lo corregiré un poco. No habrá ningún error crítico, sólo el booleano OrderSelect devolverá false... y eso es todo... Pero, por supuesto, es mejor evitarlo... Porque si las características del código no se utilizan correctamente, es difícil predecir las posibles trampas...


Sólo veo que lo único se llena a un ritmo muy rápido y llega a su límite, mientras que la magia apenas crece... Generalmente era un error utilizar la misma variable tanto para el control del bucle como para la lógica dentro del bucle, donde esta variable infla...

Imprimir para encontrar una solución en este contexto, pero yo sugeriría simplemente reformular el problema... Por ejemplo encontrar el máximo magik en las órdenes por el bucle y devolverlo con +1, esa sería la solución simple correcta.

Es un último recurso, en caso de que esta opción no funcione. Mientras tanto, esto es lo que la imprenta ha conseguido.

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber()){
              unique ++;
              Print (" MAGIC ", magic, " | UNIQUE ", unique);
            }
          }
        }
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}
------------------------------------------------

2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #10  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 9
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 8
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #9  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 8
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #8  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #7  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #6  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #5  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #4  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #3  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #2  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #1  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.827 2021.01.04 00:00:00  endless cycle test started

 
Vitaly Muzichenko #:

Se puede hacer de esta manera, el código se llama según sea necesario, por lo que su peso no es un problema

Para la prueba utilicé el sistema de compra/venta

Lo miraré mañana, no tengo energía para ponerme a ello ahora.