Errori, bug, domande - pagina 2744

 
Aliaksandr Hryshyn:

Errore:


Grazie per il suo messaggio.
Corretto.

 
Ilyas:

Domanda di ottimizzazione. Nel tester, su ogni segno di spunta ho bisogno di ottenere un segno di spunta per un ulteriore lavoro. Io lo faccio in questo modo.

void OnTick()
{
  static MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    // ...
}


È chiaro che questa variante sarà più lenta:

void OnTick()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(Symbol(), Tick))
    // ...
}


Ma SymbolInfoTick è anche più lento perché il suo parametro stringa non è passato per riferimento.


È possibile avere sovraccarichi regolari di SymbolInfo* in cui la stringa è passata per riferimento?


È meglio avere

const MqlTick _Tick; // Текущий _Symbol-тик.


In Optimizer, queste funzioni sono chiamate decine di miliardi di volte.

 
Ilyas:
Stai suggerendo di aggiungere la funzione GetNextEvent?

Non proprio, preferirei chiamare questa funzione come HandleNextEvent, una firma possibile:

bool HandleNextEvent (ENUM_EVENT_TYPE);


Quando viene chiamato, simile a GetNextEvent, controlla se l'ENUM_EVENT_TYPE specificato è presente nella coda,
e se questo evento è presente, passa automaticamente il controllo al codice utente del gestore corrispondente (OnChartEvent, OnTrade, OnTradeTransaction, ... (graziea fxsaber per l'aggiunta)).
Restituisce true se c'era un evento nella coda, altrimenti restituisce false.


Possibile caso d'uso:

//....
for(int i = 0; i < 10^6; ++i){
   // .... Data Calculations

   if((i % 10^3) == 0){
       while(HandleNextEvent(EVENT_TYPE_ALL));
   }
}
//....
 
fxsaber:

Domanda di ottimizzazione. Nel Tester, su ogni segno di spunta ho bisogno di ottenere un segno di spunta per un ulteriore lavoro. Io lo faccio in questo modo.
È chiaro che questa variante sarà più lenta.

Avete verificato questa affermazione nella pratica? Può sembrare il contrario.

MqlTick consiste di tipi di dati primitivi che non sono inizializzati.
Corrispondentemente, non si perde affatto tempo nella selezione perché è la stessa operazione "sub esp", solo di dimensioni diverse.
Come risultato, il collo di bottiglia può essere dalla parte della cache del processore per leggere un valore dalla memoria.

In generale, dovremmo testarlo ))

 
Sergey Dzyublik:

quando questo evento si verifica, trasferisce automaticamente il controllo al codice utente del gestore appropriato

Possibile caso d'uso:

Una soluzione molto bella e utile!

 
Sergey Dzyublik:

Avete testato questa affermazione nella pratica? Potrebbe rivelarsi il contrario.

Teorizzare qui. Non ho controllato. Ma il trasferimento sul link della stringa sembra appropriato.

 
Sergey Dzyublik:

Un possibile caso d'uso:

non ha alcun senso.

Secondo la firma e la vostra descrizione, il terminale dovrebbe chiamare una funzione per elaborare il prossimo evento e poi restituire il controllo al programma nel punto in cui viene chiamato l'handlenextevent?

Cosa succede se l'handlenextevent viene chiamato di nuovo durante l'elaborazione?

Cosa succede agli eventi che non passano il filtro nei parametri? vengono saltati? cambiano la coda?

Gli script non hanno affatto una coda di eventi, perché aggiungerla con le stampelle quando ci sono Expert Advisors e indicatori?

 
TheXpert:

1) Lei sta suggerendo delle sciocchezze.
2) secondo la firma e la vostra descrizione, il terminale dovrebbe chiamare l'elaborazione dell'evento successivo per funzione e poi restituire il controllo al programma al punto di chiamata handlenextevent?
3) cosa succede se l'handlenextevent viene chiamato di nuovo durante l'elaborazione?
4) e cosa succede agli eventi che non rientrano nel filtro nei parametri? vengono saltati? cambiano l'ordine?


1) Il mio lavoro è quello di offrire, ma se è qualcosa di folle o no - spetta agli sviluppatori, non a te, loro sanno un po' meglio...
2) Va bene. Se mi interessa elaborare un evento specifico, e non tutti gli eventi del sistema, sarebbe bello poter elaborare solo questo tipo di evento, lasciando l'elaborazione degli altri eventi come normale.
3) Se HandleNextEvent viene chiamato di nuovo durante l'elaborazione - chiama e processa. L'unica cosa che può succedere è lo stack overflow, ma questo è un problema dell'utente e del codice, non dello sviluppatore.
4) Gli eventi che non rientrano nel filtro rimangono nella stessa sequenza e saranno chiamati quando l'utente restituisce il controllo al sistema come al solito.


 
TheXpert:

Gli script non hanno affatto una coda di eventi, perché aggiungerla con le stampelle quando ci sono EAs e indicatori?

Ecco un esempio di uno script che apre e chiude le sue posizioni/ordini in modo asincrono.

// Максимально быстро все закрывает. Возврат, когда действие подтверждено.
bool CloseAll()
{
  uint RequestID[];
  
  for (int i = ArrayResize(RequestID, OrdersTotal()) - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
      // Отправили асинхронный приказ
      RequestID[i] = (OrderType() <= OP_SELL) ? OrderCloseAsync(OrderTicket(), OrderLots(), OrderClosePrice(), 100) : OrderDeleteAsync(OrderTicket());
  
  return(Transactions.Waiting(RequestID)); // Дождались ответа от сервера на все асинхронные приказы
}
TradeTransactions
TradeTransactions
  • www.mql5.com
Асинхронные торговые приказы обладают огромным преимуществом - высокая скорость при массовой отправке. Однако, распространению таких приказов мешает некоторое неудобство - данные о результате приказа возможно увидеть только в OnTradeTransaction. Такое обстоятельство заставляет обывателя строить событийную модель своей ТС, если хочется...
 
Sergey Dzyublik:

1) È il mio lavoro suggerire, e se è un dilemma o no non sta a te decidere, ma agli sviluppatori, loro lo sanno un po' meglio...

Se suggerisci qualcosa che è più facile da implementare, c'è una migliore possibilità di implementazione. rimosso la tua opzione perché non dà quasi nulla.

Motivazione: