Errores, fallos, preguntas - página 1724

 
MK, ¿por qué no añades funciones normales para la búsqueda binaria a la biblioteca estándar? ArrayBsearch sólo es aplicable en casos sencillos en los que los tipos son simples y no se necesita un comparador personalizado. Las plantillas están ahí, haz un override sobre c++::std::lower/upper_bound. Hasta ahora he tenido que escribirlo yo mismo, lo cual no es normal (copiado casi por completo de cppreference).
template<typename A, typename T, typename Compare>
uint lower_bound(const A &ar[], const T &value, Compare &comp){
   long count = ArraySize(ar);
   uint first = 0;
  
   while(count > 0){
      uint it = first;
      uint step = count / 2;
      it += step;
      if(comp.comp(ar[it], value)){
         first = ++it;
         count -= step + 1;
      }
      else
         count = step;
   }
   return first;
}

void OnStart(){
   struct M_point{
      double price;
      datetime time;
   };
   M_point ar[5];
   ar[0].time = 2; ar[1].time = 4; ar[2].time = 6;
   ar[3].time = 8; ar[4].time = 10;
   struct Comp{
      bool comp(const M_point &p, datetime value) {return p.time < value;}
   }cmp;
   datetime value = 6;
   lower_bound(ar, value, cmp);
   return;
}

En el proceso surgieron un par de preguntas:
1. ¿Por qué es imposible escribir operator() en Comp (está prohibido por alguna razón)?
bool operator()(const M_point &p, datetime value) {return p.time < value;}
2. ¿Por qué no podemos pasar prvalue a una función que acepta una referencia constante?
lower_bound(ar, 6, cmp) ); // ошибка
ZS: y también muy molesta esta advertencia: "struct no tiene miembros, tamaño asignado a 1 byte"
 
coderex:

Todo está bien allí, la colocación de la orden debe ser controlada a través de OnTradeTransaction, por cierto, si se conecta a la bolsa directamente a través de Plaza2, la situación es la misma - usted necesita para controlar la llegada de los mensajes sobre la colocación de la orden. En MT4, esta función es sincrónica, pero la misma opción está disponible en MT5, sólo que en este caso, la lógica se detendrá hasta que la función no reciba respuesta.

Si lo necesitas, puedo enviarte la clase de control, pero está escrita para la colocación en el mercado, pero pronto la finalizaré para los limitadores.

Para controlar la solicitud, es necesario recordar el hecho de su colocación. Se le enviará la clase.
 
fxsaber:
¡Te pido mucho que publiques algo en la kodobase! Con fines educativos.

No se puede por la razón que tú mismo has señalado https://www.mql5.com/ru/forum/1111/page1743#comment_2877482. Recientemente no pude localizar el error, pasé mucho tiempo para formar el código fuente en servicedesk - al final no salió nada debido a muchas referencias cruzadas (una tira de la otra en progresión geométrica) - envié .ex5

Para fines educativos puedo sugerir la tarea: sin introducir variables adicionales simplificar h() para que f() sea llamada en todo caso una vez

bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef  MACRO
        if ( f() )
#endif
        {
                if ( f() )
                        g1();
                g2();
        }
}
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум трейдеров MQL5.community
 
A100:

Error de compilación

(*) En general, en el patrón (1) tanto A->(2) como const A->(3) pueden ser sustituidos en lugar de T.

¿Por qué? Un patrón con const no puede aceptar non-const - viola el contrato.

 
A100:

Con fines didácticos, puedo sugerir la siguiente tarea: sin introducir variables adicionales, simplificar h() para que f() sea llamada una vez en cualquier caso

bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef  MACRO
        if ( f() )
        {
                g1();
                g2();
        }
#else
        if ( f() )
                g1();
        g2();
#endif
}
 
Stanislav Korotky:

¿Por qué? Una plantilla con const no puede aceptar non-const - viola el contrato.

La plantilla no es por sí misma (a diferencia de la función) - su tarea es realizar la sustitución (por analogía con #define). Si no hay contradicciones al final de la sustitución (y no las hay), la plantilla ha cumplido su cometido. Al menos intenté compilarlo en C++ y el compilador no dio ningún error ni advertencia
 
fxsaber:
Esto no es realmente una simplificación. En el original MACRO+2*f+g1+g2=5 - tienes: MACRO+2*f+2*g1+2*g2=7.
 
Sergey Diubakin:

¿Alguien ha experimentado un problema similar? ¿Un "bug" en el terminal o en el mío?

¿Qué devuelve GetLastError()?
 
fxsaber:

MT5-OrderSend NO está totalmente sincronizado - no hay sincronización con el entorno de trading. Esto significa que las lecturas del historial no se corresponden con la situación real.

No hay tiempo de espera. No hay una solución fiable para el problema, porque hay que tratar los problemas de sincronización a nivel de terminal, no a nivel de servidor.

De hecho, los usuarios de MT5 se enfrentan a lo mismo que los desarrolladores del puente de MT4.

Si se envía un OrderSend, hay que RECORDAR (aquí es donde está la potencial vulnerabilidad) que se hace. A continuación, ignore el historial actual (entorno comercial) hasta que llegue el mensaje correspondiente en OnTrade. Una vez que llegue, RECUERDE OLVIDARSE.

Cuando no hay REMEMBER, se puede confiar en el historial como en MT4.

MT4-OrderSend está TOTALMENTE sincronizado.
Me pregunto - por qué razón se hace esto ...
Entiendo que si te metes con OrderSendAsync de forma asíncrona, puedes manejar tanto OnTrade como OnTradeTransaction. Con OrderSend quiero tener un comportamiento simple, como en MT4. Una vez que se llama, obtenemos en la salida las posiciones abiertas ya modificadas y el historial.
Hay un punto sutil. Si el estado actual se almacena en una variable global y la expectativa de cambios de estado lleva un tiempo relativamente largo, y el operador consigue cambiar los parámetros del EA, las variables globales se reiniciarán y el estado se descartará.
 
bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
        if ( f() )

        {
                g1();
#ifdef  MACRO
        }
#endif
                 g2();
#ifndef  MACRO
        }
#endif
}