Errori, bug, domande - pagina 435

 
voix_kas:

In generale, è divertente come va a finire.
Per intuizione, ho pensato che la funzione OnDenit è una specie di distruttore e la funzione OnInit è un costruttore di un EA.

In effetti, si scopre che OnInit è un evento multiplo (all'interno della vita di Expert Advisor). Non è chiaro allora, perché abbiamo bisogno di generare esplicitamente l'evento OnDenit se sappiamo che l'EA non termina la sua operazione (per esempio, in caso di cambiamento del periodo del grafico)?

Quando i simboli cambiano, l'Expert Advisor viene caricato a caldo per un avvio rapido e per salvare la base informativa della sua vita precedente.

Per esempio, l'Expert Advisor è sul grafico, ha accumulato le sue statistiche e la sua logica, e poi viene cambiato il timeframe e deve lavorare da zero al riavvio a freddo.

E c'è un'altra domanda.
Il motivo della deinizializzazione di REASON_CHARTCHANGE - un simbolo o un periodo del grafico è stato cambiato.
Per favore, spiega come si può cambiare un simbolo del grafico senza cancellare un EA su di esso?

Nella modalità di riavvio a caldo.
 

Yedelkin, interessante, Renat
Grazie per i chiarimenti.

Penso che abbia anche senso includere una lista esplicita di riavvii "caldi" e "freddi" nella documentazione.

Se non c'è una reinizializzazione ad ogni OnInit, per il multicast EA dovremo usare una stampella, che è un flag globale. :(
Posterò il codice un po' più tardi.

 
Interesting:

L'Expert Advisor in ogni caso non sarà cancellato durante la normale inizializzazione, sarà solo permesso di fare trading sotto certe impostazioni del terminale (ma per questo l'Expert Advisor deve capire che il simbolo è stato cambiato...).

A proposito, questo mi ricorda che Avevo intenzione di chiedere agli sviluppatori di queste impostazioni.

Renat, per favore fai due diverse caselle di controllo per disabilitare il trading quando si cambia il timeframe e il simbolo. Questi sono due cambiamenti fondamentalmente diversi.

Non vorrei che i miei EA fermassero il trading quando si cambia timeframe - non è assolutamente necessario - comunque stanno elaborando ogni tick e non ci sono problemi.

Ma il cambiamento del simbolo è fondamentalmente importante. Vorrei mantenere questa chiusura... ma ora queste due regolazioni sono per qualche motivo sincronizzate e regolate insieme.

Sto risolvendo questo problema programmaticamente (memorizzando il simbolo originale in una variabile statica e controllando i cambiamenti nell'inite). Ma sarebbe meglio se questo potesse essere bloccato a livello di terminale.

Meglio ancora, sarebbe possibile regolare la possibilità stessa di cambiare timeframe o simbolo quando Expert Advisor è in esecuzione. Perché smettere di commerciare a causa della stupidità-dimenticanza?

Cioè sarebbe molto meglio bloccare il cambio di timeframe e/o simbolo (separatamente!), se è specificato nelle impostazioni che è vietato quando Expert Advisor è presente su un grafico.

// Con un messaggio corrispondente quando si tenta di farlo.

In realtà questo può essere risolto anche programmaticamente (riportando forzatamente il simbolo o il timeframe al suo posto), ma penso che tu stesso sia interessato a delle impostazioni davvero convenienti a livello di terminale.

 

MetaDriver:

Renat, per favore fai due diverse caselle di controllo per bloccare il trading sul cambio di timeframe e sul cambio di simbolo. Sono due cambiamenti fondamentalmente diversi.

Non voglio che i miei EA fermino il trading quando cambiano timeframe - non è assolutamente necessario - comunque stanno elaborando ogni tick e non ci sono problemi con questo.


Appoggio l'idea, dovreste fare due zecche e una separazione nei codici dei motivi di deinizializzazione (sarebbe comodo così).

Ma bloccare la possibilità di cambiare timeframe, non so come (sul simbolo), è troppo per me.

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации - Документация по MQL5
 
MetaDriver:

Questo mi ricorda. È da molto tempo che voglio chiedere agli sviluppatori di queste impostazioni.

Renat, per favore fai due caselle di controllo diverse per bloccare il trading sul cambio di timeframe e sul cambio di simbolo. Sono due cambiamenti fondamentalmente diversi.

Sì, sembra che la condizione di cambiare il simbolo e il timeframe siano stati combinati per niente.

Anch'io sono favorevole a dividerli in due condizioni. Il biglietto è già stato inserito nel Service Desk.

 

In realtà, sto allegando il codice per definire gli strumenti di lavoro per il multicooker. Le critiche sono benvenute. :)

input uint   inTimeToRescan = 3600; // Интервал времени для принудительного пересканирования рабочих инструментов, в секундах
input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты


bool Initialize;


int OnInit() {
  //...
  Initialize = true;
  //...
}


void OnTick() {
  static ulong  LastScan = 0;
  if ((ulong)TimeCurrent() - LastScan >= inTimeToRescan) Initialize = true;

  static string Symbol[];
//  static int    Forecast[];
//  static int    Volatile[];

  if (Initialize) {
    Comment("Опрос рабочих инструментов...");
    int SymbolCount_1 = 0;
    for (int i = 0; i < SymbolsTotal(false); i++)
      if (StringFind(inWorkSymbols, SymbolName(i, false)) != -1)
        SymbolCount_1++;

    if (!SymbolCount_1) return;
    if (ArrayResize(Symbol, SymbolCount_1) != SymbolCount_1) return;

    int SymbolCount_2 = 0;
    for (int i = 0; i < SymbolsTotal(false); i++)
      if (StringFind(inWorkSymbols, SymbolName(i, false)) != -1)
        Symbol[SymbolCount_2++] = SymbolName(i, false);

    if (SymbolCount_1 != SymbolCount_2) return;

    //if (ArrayResize(Forecast, SymbolCount_1) != SymbolCount_1) return;
    //if (ArrayResize(Volatile, SymbolCount_1) != SymbolCount_1) return;

    Initialize = false;
  }
  //...
}

Ogni tick un Expert Advisor cerca di ottenere una lista di strumenti funzionanti.
L'aggiornamento dell'elenco degli strumenti di lavoro avviene in due condizioni: 1) OnInit è attivato, 2) dopo il tempo che è stato impostato nel parametro di ingresso dell'EA.
Come vediamo, una stampella sotto forma di una variabile globale(bool Initialize) è usata per rilevare la prossima inizializzazione. Se ci fosse un'inizializzazione della statica, non sarebbe necessario.

Considero le variabili globali come il male, così come l'operatore goto incondizionato a suo tempo.

 
voix_kas:

In assenza di reinizializzazione ad ogni OnInit, per i multilaterali si deve usare una "stampella" sotto forma di flag globale. :(

È meglio scrivere il codice con cura fin dall'inizio, senza lasciare stampelle sotto forma di variabili statiche intermedie.

Come soluzione, nascondete tali dati all'interno di una classe. Se la classe è morta, anche l'ambiente è morto.

E a livello globale, lasciate un minimo di variabili statiche.

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

In realtà, sto allegando il codice per definire gli strumenti di lavoro per il multicooker. Le critiche sono benvenute. :)

Come consiglio - mettete Symbol a livello globale e azzeratelo in OnInit. Se l'array è vuoto, allora è il momento di inizializzare.

E nessuna bandiera aggiuntiva.

 
Renat:

Come consiglio, portate Symbol a livello globale e azzeratelo in OnInit. Se l'array è vuoto, allora è il momento di inizializzare.

E nessuna bandiera aggiuntiva.

Credo di essere paranoico. Non mi piacciono le variabili pubbliche (globali). Lo considero un muveton.
È possibile specificare l'attivazione di OnInit all'interno di OnTick?
Per esempio, posso dichiarare una variabile statica all'interno di OnTick che memorizza il numero di inizializzazioni dell'EA (se c'è tale o simile proprietà in MQL5)?

 
voix_kas:

Levariabili globali sono il male, come lo era l'operatore goto incondizionato ai tempi.

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

1. Perché? È necessario sbarazzarsi dei sintomi nocivi, e farlo con decisione.

2. Non nominare variabili, array e altre cose con parole chiave consonanti o simili (ma l'array "Symbol" è molto suggestivo, non si può dire se è un array o qualcos'altro nel tuo codice).

Renat:

La soluzione è nascondere tali dati all'interno della classe. Se la classe muore, muore anche l'ambiente.

E a livello globale, lasciate un minimo di variabili statiche.

Buon suggerimento. È già ora di passare a OOP... :)
Motivazione: