Errori, bug, domande - pagina 436

 
Interesting:

1. Perché? I sintomi nocivi devono essere trattati, e con decisione.

2. Variabili, array e altre cose non dovrebbero essere nominate in modo coerente o con parole chiave della lingua (ma l'array "Symbol" è molto suggestivo, non si può dire se è un array o qualcos'altro nel codice).

1. Bene, prima bisogna stabilire realmente se la sintomatologia appartiene a manifestazioni positive o negative. Nella mia esperienza, ho avuto casi in cui ho cercato di cambiare il valore di una variabile globale in una funzione che non doveva farlo (maledetto copia-incolla). Mi ci sono voluti alcuni giorni per trovare questo errore. Da allora, uso le variabili globali nei casi in cui non posso farne a meno in linea di principio.

2. Sono d'accordo. Ma se sono usati all'interno di una funzione, non mi dà fastidio. Ma le variabili globali con tali nomi sono davvero una fonte di confusione futura.

Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
Документация по MQL5: Глобальные переменные терминала / GlobalVariableGet
  • www.mql5.com
Глобальные переменные терминала / GlobalVariableGet - Документация по MQL5
 

Però ripeto la mia domanda.

È possibile determinare l'attivazione di OnInit all'interno di OnTick?
Per esempio, posso dichiarare una variabile statica dentro OnTick che memorizza il numero di inizializzazioni dell'EA (se questa o una proprietà simile è presente in MQL5)?

 
voix_kas:

Devo essere paranoico. Non mi piacciono le variabili pubbliche (globali). Lo considero un muveton.

Levariabili globali sono almeno visibili da lontano. Ma nascondere serie variabili cumulative all'interno di funzioni in statica è un modo di spalmare accuratamente un rastrello per se stessi. È la prima volta che vedo un array statico accumulativo nascosto all'interno di una funzione in questo modo. Questo è un rastrello infuocato.

Usate le classi - lasceranno il livello globale pulito, nasconderanno tutte le viscere e si sbarazzeranno delle stampelle.

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
voix_kas:

Però ripeto la mia domanda.

È possibile determinare l'attivazione di OnInit all'interno di OnTick?
Per esempio, possiamo dichiarare una variabile statica all'interno di OnTick che memorizza il numero di inizializzazione dell'Expert Advisor (se esiste una variabile simile in MQL5)?

È possibile non solo contare il numero di trigger OnInit, ma anche determinare perché l'inizializzazione è avvenuta (l'implementazione è un'altra questione).

Avete familiarità con _UninitReason, per esempio?

 
Si può leggere in OnInit, ma ho bisogno di questi dati in un altro evento (senza usare variabili globali). Da qualunque parte la si guardi, è una questione di attuazione. È lo stesso con OnDenit.
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
Classi che non ho mai scritto. Se qualcuno può aiutarmi, gliene sarò grato.
È necessario scrivere una classe WorkSymbols.
Metodi:
stringa GetSymbol[];
bool UpdateSymbols(inWorkSymbols);
bool UpdateSymbolsStatus();
int GetSymbolCount();

Mi scuso se la richiesta è sfacciata... Anch'io cercherò di capirlo.
 
Renat:

Sì, sembra un errore combinare il cambio di simbolo e la condizione di timeframe.

Sono anche favorevole a separarli in due condizioni. Il biglietto è già stato inserito nel servizio di assistenza.

Grazie!
 

In un certo senso l'ho cucinato. Le critiche sono benvenute.

input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты

class CSymbolList {
  private:
    string Symbols[];

  public:
    void   CSymbolList() { SetSymbols(""); }
    void  ~CSymbolList() { ArrayFree(Symbols); }
    int    GetSymbolCount() { return ArraySize(Symbols); }
    void   SetSymbols(string);
    string GetSymbolName(int);
};

void CSymbolList::SetSymbols(string Source) {
  ArrayFree(Symbols);
  for (int count = 1, i = 0; i < SymbolsTotal(false); i++)
    if (StringFind(Source, SymbolName(i, false)) != -1) {
      if (ArrayResize(Symbols, count) != count) {
        ArrayFree(Symbols);
        return;
      }
      Symbols[count-1] = SymbolName(i, false);
      count++;
    }
}

string CSymbolList::GetSymbolName(int Item) {
  if (Item < 0 || !ArraySize(Symbols) || Item >= ArraySize(Symbols)) return "";
  return Symbols[Item];
}

void OnStart() {
  CSymbolList slMain;
  slMain.SetSymbols(inWorkSymbols);
  for (int i = 0; i < slMain.GetSymbolCount(); i++)
    Print(slMain.GetSymbolName(i));
}
 

L'unica cosa che non mi piace qui è il ridimensionamento "live" dell'array contenente i dati di lavoro.
Domanda per gli sviluppatori, è garantito che i dati utente precedentemente inseriti nell'array dinamico che viene modificato saranno conservati nella seguente condizione?

if (ArrayResize(Symbols, count) == count)
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
voix_kas:

L'unica cosa che non mi piace qui è il ridimensionamento "live" dell'array contenente i dati di lavoro.
Una domanda per gli sviluppatori: è garantito che i dati utente precedentemente inseriti nell'array dinamico che viene modificato saranno conservati nella seguente condizione?

Scommetto che è garantito. Almeno io ci conto sempre e il problema non si è mai presentato.