MT5 e la velocità in azione - pagina 30

 
Renat Fatkhullin:

un oggetto del database dei simboli sincronizzato. Le locazioni di lettura/scrittura sono mescolate, poiché c'è un tick costante di scrittura.

C'è un oggetto del database dei simboli per tutti i simboli contemporaneamente? Se è così, allora risulta che la richiesta di un tick per EURUSD potenzialmente rallenta la richiesta di un tick per GBPUSD.


Puoi preparare un MqlTick per esso nel momento in cui OnTick viene chiamato, così non sarà richiesto dal database in generale?

 
fxsaber:

Puoi preparare un MqlTick per OnTick, così non sarà chiamato dal database in generale?

Questo sarebbe buono, allora forse MQL5 avrà variabili predefinite come in 4 - Ask e Bid

 

Molto probabilmente il rallentamento è causato da un alto consumo di CPU sul lato MT5 quando molti EAs sono in esecuzione. Non so come sia con MT4. Altrimenti è difficile spiegare perché i ritardi appaiono in un terminale vuoto in esecuzione parallela.

Sicuramente, ridurre al minimo l'uso dell'API dell'ambiente di trading risolverà il problema. Dopo la danza del tamburello riferirò i risultati.

 
fxsaber:

Hai sbagliato. Ogni EA è puramente commerciale (nel Tester con tick reali non rallentati) e non dipende da altri. Tutta la logica di trading viene eseguita solo in OnTick, niente spamming di ordini di trading, nessuna ricorsione, nessuna globalizzazione e nessuna risorsa.

OnTrade*, OnBook non sono utilizzati. Secondo timer e OnChartEvent per il caso in cui vengono premuti certi tasti.


Sono sicuro che una corretta implementazione (da parte vostra o mia) delle istantanee ridurrà notevolmente il numero di chiamate di funzioni d'ambiente regolari. Di conseguenza, i ritardi saranno drasticamente ridotti.

Non avrei mai pensato che si arrivasse ai trucchi delle istantanee. Sto studiando il problema, perché l'implementazione standard di MT5 EA è zoppa, purtroppo.

Non posso assolutamente credere al suo caso.

Abbiamo mostrato i nostri calcoli
 
Renat Fatkhullin:
Non credo affatto nel suo caso.

Attraverso TeamViewer o simile, pronto per la dimostrazione.

 
::TerminalInfoInteger(TERMINAL_BUILD) = 2605
(bool)::TerminalInfoInteger(TERMINAL_X64) = true
(bool)::TerminalInfoInteger(TERMINAL_VPS) = false
::HistoryDealsTotal() = 13973
::HistoryOrdersTotal() = 18606
::TerminalInfoInteger(TERMINAL_MAXBARS) = 5000
::TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1464
::MQLInfoInteger(MQL_MEMORY_USED) = 5
::ObjectsTotal(0) = 462
ChartsTotal = 16
::SymbolsTotal(true) = 19 (16 + 3)

Per favore, consigliate come ridurre il consumo di memoria del terminale? Sto usando zecche fresche di CopyTicks per 16 caratteri. Sembra che ogni CopyTicks tenga in memoria 128K tick. Non ne ho affatto bisogno, ma li tengo in memoria. Cosa ci vuole quasi 1,5 GB? Gli sviluppatori possono vedere quale parte della memoria è usata per cosa? Qualche rudimentale Task Manager.

 
fxsaber:

Molto probabilmente il rallentamento è causato da un alto consumo di CPU sul lato MT5 quando molti EAs sono in esecuzione. Non so come sia con MT4. Altrimenti è difficile spiegare perché i ritardi appaiono in un terminale vuoto in esecuzione parallela.

Sicuramente, ridurre al minimo l'uso dell'API dell'ambiente di trading risolverà il problema. Scriverò dei risultati dopo aver ballato con i tamburelli.

Questo è esattamente quello di cui parlavo qualche pagina fa. Inoltre, gli EA possono essere abbastanza semplici e basati su simboli non liquidi, cioè, la questione non è il numero di operazioni matematiche che avvengono all'interno del codice di ciascuno degli EA. Il problema risiede nel terminale stesso e non potremo risolverlo migliorando il nostro codice. Purtroppo :(

P.S. Ho riscritto la logica usata in metà dei miei EA da OnBook a OnTick e ho sostituito il Core i5 con lo Xeon E5-2678. Sembrerebbe che la velocità dovrebbe aumentare, ma ahimè, un miracolo non è accaduto :(

 
HistorySelect ritarda nelle funzioni OnTrade.
// Демонстрация лага HistorySelect в OnTrade*-функциях.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

input int inAlertTime = 1; // Нижний порог в миллисекундах

#define _B2(A) _B(A, inAlertTime)

const bool Init = EventSetTimer(1);

void OnTimer()
{
  static MqlTradeRequest Request = {0};
  static MqlTradeResult Result = {0};

  if (PositionSelectByTicket(Result.order)) // Если позиция открыта - закрываем.
  {
    Request.type = ORDER_TYPE_SELL;
    Request.price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
    Request.position = Result.order;
  }
  else // Иначе - открываем.
  {
    Request.action = TRADE_ACTION_DEAL;
    Request.type = ORDER_TYPE_BUY;
    Request.symbol = _Symbol;
    Request.volume = 0.1;
    Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
    Request.position = 0;
  }

  const bool AntiWarning = OrderSendAsync(Request, Result); // Асинхронный приказ не случайно
}

void OnTrade()
{
  _B2(HistorySelect(0, INT_MAX));  
}


A quasi ogni passo.

2020.09.23 11:59:46.351 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 3 ms.
2020.09.23 11:59:46.354 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:48.294 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:48.296 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:49.283 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:49.285 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:50.296 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:50.302 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 5 ms.
2020.09.23 11:59:51.275 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:51.277 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:52.267 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 4 ms.
2020.09.23 11:59:52.269 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 2 ms.
2020.09.23 11:59:54.277 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 3 ms.
2020.09.23 11:59:54.282 Alert: Time[Test6.mq5 437: HistorySelect(0,INT_MAX)] = 5 ms.


Speriamo che la costruzione della cache non richieda così tanto tempo, e che questo ritardo sia dovuto all'accesso al database durante l'aggiornamento dello stesso.

 

Qualche idea sul perché mt5 non presenti la scheda 'Commissioni'? Appaiono solo dopo la chiusura di uno scambio.

Qualche idea sul perché mt5 non abbia la scheda 'Commissioni'? Appaiono solo dopo la chiusura di uno scambio.

 

Se si esegue questo EA su un conto senza posizioni o ordini correnti.

// Создает маркет-ордер в случае, если нет текущих позиций и ордеров.
bool PositionOpen()
{
  bool Res = (!PositionsTotal() && !OrdersTotal());
  
  if (Res)
  {
    MqlTradeRequest Request = {0};
    MqlTradeResult Result;
    
    Request.action = TRADE_ACTION_DEAL;
    Request.symbol = _Symbol;
    Request.volume = 0.1;
    Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
    
    Res = OrderSendAsync(Request, Result);    
  }
  
  return(Res);
}

void OnInit()
{
  PositionOpen();
}

void OnTrade()
{
  PositionOpen();
}

e poi chiudere manualmente la posizione aperta dall'EA, allora ci saranno tre posizioni aperte sulla copertura (sulla posizione a triplo volume netting).


È questo il comportamento corretto? Probabilmente non ho capito bene il Terminale. Allora, per favore, spiega.