Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 714

 
dimnik:

Con l'uso di OnTradeTransaction, il tempo di ottimizzazione è stranamente cambiato. Un sistema su 15M, molto semplice, storia annuale, una corsa avviene in 0,3 - 0,4 secondi.

Dopo l'inizio dell'ottimizzazione le prime 200-300 corse vanno a meno di un secondo, le successive rallentano fino a 15-20 secondi (50 volte!);

Nessun surriscaldamento del processore o trotto, più della metà della memoria è libera (da 16GB).

Prima di usare il gestore OnTradeTransaction non c'era nulla del genere - anche Expert Advisors più complessi su piccoli timeframe erano ottimizzati con circa la stessa velocità.

HistoryDealSelect influenza così tanto la velocità? Come possiamo eliminare i ritardi?

void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   if( trans.type != TRADE_TRANSACTION_DEAL_ADD) return;
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
   long     deal_type         =0;
   double   deal_volume       =0;
   long     deal_magic        =0;
   if(HistoryDealSelect(trans.deal))
     {
      deal_type         =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
      deal_volume       =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
      deal_magic        =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
     }
   else
      return;
   if (deal_type == DEAL_TYPE_BUY && deal_magic == MagicNumber) current_position += deal_volume;
   if (deal_type == DEAL_TYPE_SELL && deal_magic == MagicNumber) current_position -= deal_volume;
      
  }


Mostrami tutto il codice.
 

Ciao!

Chi sa - come visualizzare le barre a destra della barra zero nell'indicatore e quanti max? (previsione di prezzo da fare)

 
dimnik:

È HistoryDealSelect che influisce negativamente sulla velocità? Come si può eliminare il rallentamento?

Gli sviluppatori raccomandano di ridurre al minimo le chiamate alle funzioni di cronologia (costose) - attraverso il caching della cronologia.

Ho postato una soluzione funzionante in kodobase (MT4Orders), ma probabilmente non sarà adatta a te.

Non ho visto alcun lag dopo aver usato la cache.

Tuttavia, la vostra OnTradeTransaction non dovrebbe rallentare, anche se non è scritta in modo ottimale.

 
Renat Akhtyamov:

Ciao!

Chi sa - come visualizzare le barre a destra della barra zero nell'indicatore e quanti max? (previsione di prezzo da fare)

Aggiungi PeriodSeconds() al tempo di apertura dell'ultima barra e disegna lì una candela con oggetti grafici. L'importo massimo sarà mostrato sulla destra. Ma non ho controllato come verrà visualizzato se c'è un'uscita. Probabilmente, dovrebbe essere preso in considerazione da solo.
 
Alexey Viktorov:
Aggiungi PeriodSeconds() al tempo di apertura dell'ultima barra e disegna lì una candela con oggetti grafici. Al massimo sarà visibile sulla destra. Ma non ho controllato come verrà visualizzato se c'è un'uscita. Probabilmente si dovrebbe prendere in considerazione.
Grazie, ce l'ho!
 
Alexey Viktorov:
Aggiungi PeriodSeconds() al tempo di apertura dell'ultima barra e disegna la candela lì. Al massimo, lo vedrete sulla destra. Ma non ho controllato il suo aspetto. Probabilmente, è necessario prendere in considerazione.

Sul grafico disegna una continuazione, ma purtroppo non nella finestra dell'indicatore.

Forse mi sbaglio, naturalmente...

Cosa ne pensi - posso continuare la linea dell'indicatore oltre la barra zero a destra?

 
Chissà - è possibile continuare la linea dell'indicatore oltre la barra zero a destra?
 
Renat Akhtyamov:
Chissà - la linea dell'indicatore può essere estesa oltre la barra dello zero a destra?
È possibile. È possibile impostare uno spostamento, ma probabilmente non sarà possibile calcolare per valori non esistenti, e il tempo non viene utilizzato nella visualizzazione dell'indicatore. Questo è il motivo per cui parlavo della visualizzazione delle barre tramite elementi grafici. L'ObjectCreate() contiene sia il numero della finestra (sottofinestra) che il tempo. Non dovrebbero esserci problemi nella creazione di elementi grafici.
 
Alexey Viktorov:
È possibile. È possibile spostarlo, ma il calcolo probabilmente non sarà fatto utilizzando valori inesistenti, e il tempo non viene utilizzato nella visualizzazione dell'indicatore. Questo è il motivo per cui parlavo della visualizzazione delle barre tramite elementi grafici. L'ObjectCreate() contiene sia il numero della finestra (sottofinestra) che il tempo. Pertanto, non ci dovrebbero essere problemi quando si creano elementi grafici.

Nella finestra del grafico, usando i timestamp, potete fare riferimento alle barre future previste. Ha funzionato.

Tuttavia non posso fare lo stesso nella finestra dell'indicatore. Cioè non posso scrivere valori nel buffer dell'indicatore con l'indice -1, -2, ecc.

La domanda è questa.

È chiaro, in linea di principio. La soluzione è quella di creare un indicatore di oggetti grafici.

 
Renat Akhtyamov:

Nella finestra del grafico, usando i timestamp, potete fare riferimento alle barre future previste. Ha funzionato.

Tuttavia non posso fare lo stesso nella finestra dell'indicatore. Cioè non posso scrivere valori nel buffer dell'indicatore con l'indice -1, -2, ecc.

La domanda è questa.

In linea di principio, è chiaro. La soluzione è creare l'indicatore tramite oggetti grafici.

Calcola il secondo buffer sui suoi valori normali, per esempio (se vogliamo calcolare 10 barre per visualizzare il "futuro"), poi calcola questo buffer sui valori Buff[9] -- Buff[8] -- Buff[n] -- Buff[0], e poi visualizza questo buffer con un offset non nullo. Impostare l'offset del buffer al numero di barre desiderato in futuro - 10 in questo caso
Motivazione: