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

 
Mihail Matkovskij #:

Bene, in ENUM_TIMEFRAMES i valori minimi e massimi sono noti. Perciò possono essere impostati esplicitamente.

Con altri enum, è sufficiente conoscere la loro gamma approssimativa di valori. Se le costanti non sono specificate nella dichiarazione enum, i valori lì di solito iniziano da 0. i_max_enum può essere impostato con qualsiasi numero a due o tre cifre: 50, 100, 255.

Potete anche ottenere sperimentalmente i valori minimi e massimi dell'enum. Scriveteli e specificateli in StringToEnum per una velocità ottimale:

int nEnum;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T>
bool enumFindMinMax(const T _enum, int &__min, int &__max, int _minEnum, int _maxEnum) {
  T enum_;
  int min, max;
  min = INT_MAX; max = INT_MIN;
  nEnum = 0;
  for(int i = _minEnum; i <= _maxEnum && !IsStopped(); i++) {
    enum_ = (T)i;
    if(StringFind(EnumToString(enum_), "::", 0) >= 0)
      continue;
    if (i < min)
      min = i;
    if (i > max)
      max = i;
    nEnum++;
  }
  if (min != INT_MAX && max != INT_MIN) {
    __min = min;
    __max = max;
    return true;
  }
  return false;
}

template <typename T>
bool enumFindMinMax(const T _enum, int &__min, int &__max) { return enumFindMinMax(_enum, __min, __max, INT_MIN, INT_MAX); }

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart() {
  int min, max;
  if (enumFindMinMax((ENUM_ACCOUNT_INFO_DOUBLE)0, min, max, -500, 500))
    printf("enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: %d, max: %d, Count: %d", min, max, nEnum);
  else
    Print("enumFindMinMax Error!");
}

Risultato dello script:

enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: 37, max: 52, Count: 14

Aprire ENUM_ACCOUNT_INFO_DOUBLE e vedere. Il numero di costanti è Conte (14). Così all'inizio dell'applicazione potete gestire tutti gli enum necessari, scrivere i loro valori minimi e massimi e usare StringToEnum corrispondenti min e max con la migliore velocità.

P.S. La seconda variante di enumFindMinMax con INT_MIN e INT_MAX è davvero molto lenta. Ho provato all'inizio. Poi mi sono stancato di aspettare che enumFindMinMax finisse e ho impostato valori da -500 a 500.

if (enumFindMinMax((ENUM_ACCOUNT_INFO_DOUBLE)0, min, max, -500, 500))

Così, sono arrivato alla conclusione che non è affatto necessario utilizzare l'intera gamma int.

File:
 

Mi trovo di fronte a uno strano comportamento del terminale.

La situazione è la seguente: un Expert Advisor sta lavorando in un grafico, che ad un certo momento apre un altro grafico e imposta un certo tempio sul nuovo grafico. Quest'ultimo modello è stato definito per lanciare il secondo EA sul nuovo grafico.

Tutto funziona bene a metà settimana, ma quando il mercato è chiuso, nel fine settimana, il nuovo templet viene avviato sul nuovo grafico (come si può vedere quando si cambia l'aspetto del grafico), ma il secondo EA non parte. L'unico modo per "spingere" il secondo Expert Advisor è quello di avviare manualmente, su qualsiasi grafico, qualsiasi script, anche uno assolutamente vuoto. Poi il secondo esperto inizia a lavorare su un nuovo grafico.

Ho scritto questo codice nel primo Expert Advisor sia usando le funzioni ChartOpen e ChartApplyTemplate sia usando la classe CChart - risulta sempre allo stesso modo, in un mercato chiuso il secondo Expert Advisor su un nuovo grafico non parte finché non "spingo" manualmente il terminale in qualche modo.

Chi può aver affrontato una tale situazione? Come affrontarlo, in che modo "scavare"?

 
akskarabey ChartApplyTemplate sia usando la classe CChart - risulta sempre allo stesso modo, in un mercato chiuso il secondo Expert Advisor su un nuovo grafico non parte finché non "spingo" manualmente il terminale in qualche modo.

Chi può aver affrontato una tale situazione? Come affrontarlo, in che modo "scavare"?

Come fai a sapere che non parte?

P.S.

Prova così

int OnInit()
{
....
....

 ChartRedraw();
  return(INIT_SUCCEEDED);
}
 
Mihail Matkovskij #:

Potete trovare la costante in enum con una funzione di forza bruta (stesso principio di), traducendola con EnumToString e confrontandola con la costante desiderata. Non resta che restituire il risultato.

Possiamo avere un esempio (o almeno una linea chiave), perché non mi viene in mente niente? Dovresti anche passare attraverso un'enorme lista di valori, setacciando tutti quelli mancini o cercheresti solo quelli utili? Al momento non credo ci sia nulla da vagliare, non ci sono mancini nella lista... ma non riesco ad afferrare l'idea.

 
x572intraday #:

Puoi farmi un esempio (o almeno una linea chiave), perché non mi viene in mente niente? Sarebbe anche un'enorme lista di valori con il setaccio di quelli giusti tra quelli di sinistra, o solo quelli utili? Al momento non credo ci sia nulla da vagliare, non ci sono mancini nella lista... ma non riesco ad afferrare l'idea.

Per evitare di passare attraverso tutti i possibili valori dell'enum (perché è davvero lungo) si dovrebbero fare i seguenti preparativi(qualcosa come il caching). Allora con l'aiuto di questa funzione potete facilmente tradurre stringhe/righe in enum conoscendo gli intervalli di tutti gli enum necessari. Oppure si può cercare enum in un intervallo relativamente piccolo.

template<typename T>
bool StringToEnum(const string i_str, T &o_val, int i_min_enum, int i_max_enum)
{
   for(int i = i_min_enum; i <= i_max_enum && !IsStopped(); i++) {
     o_val = (T)i;
     if(i_str == EnumToString(o_val))
       return(true);
   }
   o_val = WRONG_VALUE;
   return(false);
}


template<typename T>
bool StringToEnum(const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN, INT_MAX); } // медленный вариант
 
Vitaly Muzichenko #:

Come ha stabilito che non partiva, come può dirlo?

P.S.

Prova così

Il secondo esperto nella sezione OnInit fa delle conclusioni nel log e non ci sono messaggi di log. Il log non contiene nemmeno un messaggio dal terminale sull'avvio dell'Expert Advisor. E il nome dell'Expert Advisor non appare sul grafico in alto a destra.

 
12345678902003 #:
E quale funzione viene usata per questo scopo? MqlRates? E se uso ObjectGet, dovrei specificare la proprietà dell'oggetto lì; se prendo OBJPROP_PRICE, come dovrei fare per recuperare il prezzo alla barra corrente.

Get è Get. E c'è una funzione per ottenere il prezzo o il tempo su una barra da un oggetto per nome o per tipo di oggetto e per nome ottenere una certa proprietà dell'oggetto. Non viene usato il numero della barra, ma l'offset da zero.

 
Valeriy Yastremskiy #:

Get è Get. E c'è una funzione per ottenere il prezzo o il tempo su una barra da un oggetto per nome o per tipo di oggetto e per nome ottenere una certa proprietà dell'oggetto. Non viene usato il numero della barra, ma l'offset da zero.

Questo può essere fatto usando la funzione ObjectGetValueByTime().

Esempio

double p = ObjectGetValueByTime( 0,"имя объекта...",Time[0]);
 
Ho il seguente problema - la cartella Terminal\MQL4\Indicators ha degli indicatori nella sua lista di indicatori, ma il terminale MQL4 stesso non ha questi indicatori nella sua lista da cui questi indicatori sono trascinati sul grafico. Come far apparire questi indicatori nella lista del terminale, in modo che possano essere utilizzati nel grafico del terminale MQL4 ? Nella schermata a destra ci sono gli indicatori che sono disponibili nel terminale MQL4 e a sinistra gli indicatori dello stesso terminale nella cartellaMQL4 4\Indicators (come esempio)
File:
 
Halina Okopna-Pecuch #:
Ho il seguente problema - la lista degli indicatori nella cartella Terminal\MQL4\Indicators contiene indicatori, ma nel terminale MQL4 nella sua lista da cui questi indicatori sono trascinati sul grafico, non lo sono. Come far apparire questi indicatori nella lista dei terminali, in modo che possano essere utilizzati nel grafico del terminale MQL4? Nella schermata a destra ci sono gli indicatori che sono disponibili nel terminale MQL4 e a sinistra gli indicatori dello stesso terminale nella cartellaMQL4 4\Indicators (come esempio )

Questi probabilmente non sono indicatori.