Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1617

 
MakarFX #:

E se è così

Mi ci è voluto molto tempo per capire perché la tua soluzione non causa un ciclo infinito. Tuttavia, si esegue anche 1 volta. Ma la soluzione di cui sopra mi ha spinto a creare un interruttore 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;
      } 
  }
Ora il codice viene eseguito solo quando il pulsante viene premuto. Ma cosa succede se il terminale funziona per diversi giorni? L'aiuto per un altro metodo che restituisce il tempo, dice che ci sarà un overflow.

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;
      }
  }
Lo stesso codice ma con Seconds() invece di GetMicrosecondCount non funziona. "Seconds() > 20" se superiore - il pulsante si blocca nello stato "premuto". Se più basso - funziona, ma così velocemente che è quasi invisibile (lampeggia).
 
Nerd Trader #:
Non sono riuscito a capire per molto tempo perché la vostra soluzione non causa un ciclo infinito. Tuttavia, esegue anche da solo 1 volta. Ma la soluzione di cui sopra mi ha spinto a creare un interruttore booleano.
Ora il codice viene eseguito solo quando il pulsante viene premuto. Ma cosa succede se il terminale funziona per diversi giorni? La guida per un altro metodo che restituisce il tempo dice che si verificherà un overflow.

Lo stesso codice ma con Seconds() invece di GetMicrosecondCount non funziona. "Seconds() > 20" se superiore - il pulsante si blocca nello stato "premuto". Se più basso, funziona, ma così velocemente che è quasi impercettibile (lampeggia).

Allora è così

//+------------------------------------------------------------------+
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 #:

Allora è così

No, non funziona così, e se i secondi non funzionano, TimeCurrent() a maggior ragione. Milesecondi è l'unica variante funzionante finora, anche se può causare un overflow.
 
Nerd Trader #:
No, non funziona così, se i secondi non funzionano, a maggior ragione TimeCurrent(). Milesecondi è l'unica variante funzionante finora, anche se può causare un overflow.
Funziona!
 
MakarFX #:
Funziona!
mmm non funziona per me: il pulsante non si sgancia da solo.
 
Nerd Trader #:
mmm non funziona per me: il pulsante non si sgancia da solo.
Il mercato è ora chiuso, TimeCurrent() non cambia. Controlla su crypto, funziona nei fine settimana
 
MakarFX #:
Il mercato è ora chiuso, TimeCurrent() non cambia. Controlla su crypto, funziona nei fine settimana
Crypto al mio broker non fa trading nei fine settimana. Provato nel tester - non funziona.
 
Nerd Trader #:
Crypto presso il mio broker nel fine settimana non è in commercio. Provato nel tester - non funziona.
Aprire la demo di A-Markets. Il timer non funziona nel tester.
 

Saluti, sto ricevendo una matrice.

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

Come posso cambiarlo in modo che tutti i numeri siano presenti ma senza ripetizioni?

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

Saluti, c'è un array

Come posso cambiarlo in modo che tutti i numeri siano presenti, ma senza ripetizioni?

Potete farlo senza usare librerie

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);
}
//+------------------------------------------------------------------+