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

 
MakarFX #:

Y si es así

Me costó mucho tiempo entender por qué tu solución no provoca un bucle infinito. Sin embargo, también se ejecuta 1 vez. Pero la solución anterior me llevó a crear un interruptor booleano.
ulong ms=0;
bool msFlag=0;

void OnTimer(){
  if(msFlag!=0 && GetMicrosecondCount()-ms > 100000){
    ObjectSetInteger(0,"button1",OBJPROP_STATE,false);
    msFlag=0;
  }
}

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
  {
    if(id==CHARTEVENT_OBJECT_CLICK && sparam=="button1"){
      ms=GetMicrosecondCount();
      msFlag=1;
      } 
  }
Ahora el código se ejecuta sólo cuando se pulsa el botón. ¿Pero qué ocurre si el terminal funciona durante varios días? La ayuda para otro método que devuelve el tiempo, dice que habrá un desbordamiento.

ulong ms=0;
bool msFlag=0;

int OnInit()
{
    EventSetMillisecondTimer(1);
    ...
}

void OnTimer(){
  if(msFlag!=0 && Seconds() > 20){
    ObjectSetInteger(0,"button1",OBJPROP_STATE,false);
    msFlag=0;
  }
}

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
  {
    if(id==CHARTEVENT_OBJECT_CLICK && sparam=="button1"){
      msFlag=1;
      }
  }
El mismo código pero con Seconds() en lugar de GetMicrosecondCount no funciona. "Seconds() > 20" si es mayor - el botón se congela en estado "pulsado". Si es más bajo, funciona, pero tan rápido que es casi imperceptible (parpadea).
 
Nerd Trader #:
No pude entender durante mucho tiempo por qué su solución no causa un bucle infinito. Sin embargo, también se ejecuta por sí solo 1 vez. Pero la solución anterior me llevó a crear un interruptor booleano.
Ahora el código sólo se ejecuta cuando se pulsa el botón. ¿Pero qué ocurre si el terminal funciona durante varios días? La ayuda para otro método que devuelve el tiempo dice que se producirá un desbordamiento.

El mismo código pero con Seconds() en lugar de GetMicrosecondCount no funciona. "Seconds() > 20" si es mayor - el botón se congela en estado "pulsado". Si es inferior - funciona, pero tan rápido que es casi invisible (parpadea).

Entonces es así

//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
      if(id==CHARTEVENT_OBJECT_CLICK && sparam=="button1")
         {ms=TimeCurrent();}
  }
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(ms!=0&&TimeCurrent()>ms)
     {
      ObjectSetInteger(0,"button1",OBJPROP_STATE,false);
      ms=0;
     }
  }
//+------------------------------------------------------------------+
 
MakarFX #:

Entonces es así

No, no funciona así, y si los segundos no funcionan, TimeCurrent() mucho más. Mileseconds es la única variante viable hasta ahora, aunque puede causar un desbordamiento.
 
Nerd Trader #:
No, no funciona así, si los segundos no funcionaran, entonces TimeCurrent() con mayor razón. Hasta ahora, la única variante viable es la de millas-segundo, aunque puede provocar un desbordamiento.
¡Funciona!
 
MakarFX #:
¡Funciona!
mmm no me funciona: el botón no se suelta solo.
 
Nerd Trader #:
mmm no me funciona: el botón no se suelta solo.
El mercado está cerrado, TimeCurrent() no cambia. Comprueba en crypto, funciona los fines de semana
 
MakarFX #:
El mercado está cerrado, TimeCurrent() no cambia. Compruebe en cripto, está trabajando en los fines de semana
Crypto en mi broker no opera los fines de semana. Probado en el probador - no funciona.
 
Nerd Trader #:
Crypto en mi corredor en el fin de semana no está operando. Probado en el probador - no funciona.
Abre la demo de A-Markets. El temporizador no funciona en el probador.
 

Saludos, estoy recibiendo un array.

int arr[]={6,4,6,7,55,55,7,6,77,66,66,2,2};

¿Cómo puedo cambiarlo para que todos los números estén presentes pero sin repeticiones?

int re[]={6,4,7,55,77,66,2};
 
Galim_V #:

Saludos, hay una matriz

¿Cómo puedo cambiarlo para que todos los números estén presentes, pero sin repetirse?

Puede hacerlo sin utilizar las bibliotecas

int arr[]= {6,4,6,7,55,55,7,6,77,66,66,2,2};
int re[];
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  int AS=ArraySize(arr);
  int n=0;
  for(int i=0; i<AS; i++) {
    if(ArraySearch(re, arr[i])==-1) {
      n++;
      ArrayResize(re,n);
      re[n-1]=arr[i];
    }
  }
  ArrayPrint(re);
}
//===============================================================================================
//------------------------------ Функция удаляет копии с массива -------------------------------+
//===============================================================================================
int ArraySearch(int& m[], int e)
{
  for(int i=0; i<ArraySize(m); i++) {
    if(m[i]==e) return(i);
  }
  return(-1);
}
//+------------------------------------------------------------------+
Razón de la queja: