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

 
Maksim Emeliashin array statici di nomi di ogni possibile valore e ricerca di stringhe in questo array.

Per MQL questa funzione non funziona correttamente

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

https://www.mql5.com/ru/docs/strings/stringcompare

Parametri

stringa1

[La prima stringa.

stringa2

[Seconda stringa.

case_sensitive=true

[Modalità sensibile alle maiuscole e alle minuscole. Se è vero, allora "A">"a". Se falso, allora "A"="a". Il valore predefinito è true.

Se ci saranno due costanti in enum, per esempio ENUM1 e enum1, allora a i_str: la funzione"enum1" può restituire il valore della costanteENUM1. Perché proprio StringCompare? Se può essere fatto nel modo seguente:

template<typename T>
bool StringToEnum(const string i_str, T &o_val)
{
   for(int i = INT_MIN; i <= INT_MAX && !IsStopped(); i++) // перебор всех возможных значений int
      {
         o_val = (T)i;
         if(i_str == EnumToString(o_val))
            return(true);
      }
   o_val = WRONG_VALUE;
   return(false);
}
 
Amon1953 della chiusura di una posizione da SL.

Ne ho bisogno per prendere una decisione su cosa fare dopo.

Nella finestra della cronologia del terminale MT5 è possibile selezionare un affare, un ordine o una posizione.

Nella storia del trading devi cercare un trade con DEAL_REASON uguale a DEAL_REASON_SL.


Aggiunto: Può essere semplificato - in OnTradeTransaction basta catturare la transazione TRADE_TRANSACTION_DEAL_ADD e chiamando la trade history cercare DEAL che ha creato questa transazione. E poi la stessa ricetta: ... DEAL_REASON è uguale a DEAL_REASON_SL

 
Mihail Matkovskij #:

La funzione non funziona correttamente per MQL

https://www.mql5.com/ru/docs/strings/stringcompare

Se ci sono due costanti in enum, per esempio ENUM1 e enum1, allora con i_str:"enum1" la funzione può restituire il valore della costanteENUM1. Perché abbiamo bisogno di StringCompare? Se può essere fatto nel modo seguente:

E una variante più veloce:

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

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

A cosa serve tutto questo? Volete sostituire i valori numerici di ENUM_TIMEFRAMES con i vostri? O cosa?

Bene, in questo momento ho bisogno di scrivere le impostazioni degli indicatori e i parametri dell'EA nel database. Allo stesso tempo vorrei avere:

1. registrazioni leggibili dall'uomo

2. registrazioni leggibili a macchina

3. La stabilità di aggiungere nuovi valori in enum personalizzati, non necessariamente alla fine.

Non c'è nessun problema con record - EnumToString, ma gli sviluppatori non hanno fatto la funzione inversa, a differenza di tutti gli altri tipi.

 
Mihail Matkovskij #:

E una versione più veloce:

Sono d'accordo sul confronto case-insensitive, ho scritto un moto più generalizzato per me stesso, per il mio enum, dove non uso le minuscole.

Ma se per ENUM_TIMEFRAMES eseguite questa variante:

bool StringToEnum(const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN, INT_MAX); } // медленный вариант
si può avere il tempo per un caffè mentre si raccoglie, ad esempio per PERIOD_MN1 :)
 
Valeriy Yastremskiy #:

Prendi i prezzi dalle linee rette su ogni barra e confronta o trova la differenza, nei punti in cui i segni delle differenze di incrocio cambiano) Non ci possono essere uguaglianze sulla barra, a proposito.

Quale funzione si usa per questo? MqlRates? E se uso ObjectGet allora devo specificare la proprietà dell'oggetto lì, se prendo OBJPROP_PRICE allora come posso fargli ottenere il prezzo prima della barra corrente.
 
12345678902003 #:
Aiuto per favore, ho disegnato due linee Gunn e si intersecano in un certo punto, ho bisogno di sapere le coordinate del punto di intersezione di queste linee.
Se potete determinare il prezzo del secondo punto della linea di Gann, allora KimIV può aiutarvi ulteriormente
 
Maksim Emeliashin #:

Sono d'accordo sul confronto con l'ignorare il caso, ho scritto una bicicletta più generalizzata per me stesso, per il mio enum, dove non uso le minuscole.

Ma se per ENUM_TIMEFRAMES viene eseguita questa variante:

si può avere il tempo di bere il caffè prima che prenda, ad esempio per PERIOD_MN1 :)

Bene, in ENUM_TIMEFRAMES i valori minimi e massimi sono noti. Ecco perché possono essere specificati esplicitamente.

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

 
Maksim Emeliashin #:

In questo momento, ho bisogno di scrivere le impostazioni dell'indicatore e i parametri EA nel database. Allo stesso tempo vorrei avere:

1. registrazioni leggibili dall'uomo

2. registrazioni leggibili a macchina

3. stabilità per aggiungere nuovi valori nel suo enum personalizzato, non necessariamente alla fine.

Non c'è nessun problema con record - EnumToString, ma gli sviluppatori non hanno fatto una funzione inversa, a differenza di tutti gli altri tipi.

Avete mai provato a stampare un'enumerazione?

Print(PERIOD_M5);

Cosa pensate che verrà stampato?


Ma creare un'enumerazione programmaticamente... sì. Sarebbe interessante.

 
x572intraday #:
Perché non possiamo fare un ciclo attraverso i parametri di input? Perché ci punite così?
Questa è ovviamente una stampella, ma io la uso: inserisci tutti i dati richiesti in una variabile di input stringa attraverso un dato separatore, e poi usa StringSplit per farli traboccare in un array.
Motivazione: